hdu 4107当卡段树「建议收藏」

hdu 4107当卡段树

大家好,又见面了,我是全栈君。

其核心思想是记录最大的节点值和最低值,假设max<p要么min>=p时间,在节点只变化add值,不要子树遍历;否则,就往子树递归。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>

using namespace std;

const int maxn = 2e5+50;
int N, P;

struct node{
	int l, r, Min, Max, add;
	int mid() { return (l+r)/2; }
}tree[maxn<<2];

int p, n;
void buildTree(int l, int r, int rt)
{
	tree[rt].l = l;
	tree[rt].r = r;
	tree[rt].add = 0;
	tree[rt].Min = 0;
	tree[rt].Max = 0;
	if(l == r) return ;
	int mid = tree[rt].mid();
	buildTree(l, mid, rt<<1);
	buildTree(mid+1, r, rt<<1|1);
}

void update(int l, int r, int rt, int L, int R, int add)
{
	if(L <= l && R >= r)
	{
		if(tree[rt].Max < P)
		{
			tree[rt].add += add;
			tree[rt].Min += add;
			tree[rt].Max += add;
			return ;
		}
		else if(tree[rt].Min >= P)
		{
			tree[rt].add += 2*add;
			tree[rt].Min += 2*add;
			tree[rt].Max += 2*add;
			return ;
		}
	}
	if(tree[rt].add){
		tree[rt<<1].add += tree[rt].add;
		tree[rt<<1].Min += tree[rt].add;
		tree[rt<<1].Max += tree[rt].add; 
		tree[rt<<1|1].add += tree[rt].add;
		tree[rt<<1|1].Min += tree[rt].add;
		tree[rt<<1|1].Max += tree[rt].add;
		
		tree[rt].add = 0;
	}
	if(l == r) return ;
	int mid = tree[rt].mid();
	if(L <= mid) update(l, mid, rt<<1, L, R, add);
	if(R > mid) update(mid+1, r, rt<<1|1, L, R, add);
	
	tree[rt].Min = min(tree[rt<<1].Min, tree[rt<<1|1].Min);
	tree[rt].Max = max(tree[rt<<1].Max, tree[rt<<1|1].Max);
} 

void query(int l, int r, int rt)
{
	if(tree[rt].Min == tree[rt].Max){
		for(int i = l; i <= r; i ++)
			printf( i == N ? "%d\n" : "%d ", tree[rt].Min );
		return ;
	}
	if(tree[rt].add)
	{
		tree[rt<<1].add += tree[rt].add;
		tree[rt<<1].Min += tree[rt].add;
		tree[rt<<1].Max += tree[rt].add; 
		tree[rt<<1|1].add += tree[rt].add;
		tree[rt<<1|1].Min += tree[rt].add;
		tree[rt<<1|1].Max += tree[rt].add;
		
		tree[rt].add = 0;
	}	
	if(l == r) return ;
	int mid = tree[rt].mid();
	query(l, mid, rt<<1);
	query(mid+1, r, rt<<1|1);
}

int main()
{
	int n, m, p;
	int a, b, c;
	while(~scanf("%d%d%d", &n, &m, &p))
	{
		N = n;
		P = p;
		buildTree(1, n, 1);
		for(int i = 0; i < m; i ++)
		{
			scanf("%d%d%d", &a, &b, &c);
			update(1, n, 1, a, b, c);
		}
		query(1, n, 1);
	}
} 


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116662.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java中的onresume_java – onActivityResult()之前调用onResume()?

    java中的onresume_java – onActivityResult()之前调用onResume()?这里是我的应用程序布局:>onResume()提示用户登录>如果用户登录,他可以继续使用该应用程序3.如果用户在任何时候退出,我想再次提示登录我该如何实现呢?这里是我的MainActivity:@OverrideprotectedvoidonResume(){super.onResume();isLoggedIn=prefs.getBoolean(“isLoggedIn”,…

    2022年5月11日
    38
  • 录屏做成gif的软件_下载录屏软件

    录屏做成gif的软件_下载录屏软件推荐一款神奇的gif录屏小软件,开源免费安装后打开即可录屏支持win,macos下载:https://www.cockos.com/licecap/github:https://github.com/justinfrankel/licecap

    2022年9月16日
    2
  • 常用的DC转DC 降压电路 MP1584EN 5V 3.3V 1.8V[通俗易懂]

    常用的DC转DC 降压电路 MP1584EN 5V 3.3V 1.8V[通俗易懂]资料参考:https://wenku.baidu.com/view/b836b110ce84b9d528ea81c758f5f61fb73628d8.html输入电压:4.5-28V输出电压:0.8-20V下图是8V-28V转5V的电路(亲测使用中)下图是4.5V-28V转1.8V参考电路下图是4.5V-28V转3.3V参考电路下图是对应不同输出电压值所调…

    2022年6月20日
    28
  • 免费的网络传真平台_发传真不显示发送号码

    免费的网络传真平台_发传真不显示发送号码首先我们看到的是免费网络传真:faxZERO  官方网址是:http://faxzero.com/  这个免费传真适用于美国和加拿大,发送的传真上会自动附上广告,每次发传真只能发三页,也每天只可以发两次。  faxZERO无需你拥有一台传真机,也不需要注册用户即可在线发送免费网络传真,每天可发送2个免费网络传真,每个免费网络传真最多可发3个页面,支持.DOC(Word)和.

    2022年4月19日
    45
  • 从box-sizing:border-box属性入手,来了解盒模型

    从box-sizing:border-box属性入手,来了解盒模型从最开始学习CSS的时候,就了解了盒模型的概念,今天,我们从其中的box-sizing:border-box;的属性入手,来重新认识一下盒模型在实际项目中的运用。背景:先声明一下运用的场景,假如项目布局使用的是自适应的布局方式,div给出的宽度是百分比的形式,即框占窗口宽度的50%,但边界和内边距是用像素来表示的怎么办?为了避免这种问题,可以使用属性box-sizing来调整框…

    2022年4月29日
    48
  • pycharm如何分段运行_pycharm只运行部分代码

    pycharm如何分段运行_pycharm只运行部分代码在最新版的pycharm中拥有类似jupyter的分段执行代码功能,其使用方法如下:1.在想要分段运行的段前一行(空白行)输入#%%2.选择Usescientificmode3.分段运行的结果补充知识:Pycharm分行或分块执行介绍Pycharm中其实也可以使用类似于Spyder和Jupyter中的分行或分块执行,主要可以使用两种方法。需要注意的是,下面两种方法的本质都是在控制台执行,要注意…

    2022年8月26日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号