社区讨论

60分求调

P1253扶苏的问题参与者 3已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mhjih8ed
此快照首次捕获于
2025/11/04 03:06
4 个月前
此快照最后确认于
2025/11/04 03:06
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
long long arr[1001000],n,q;
struct node{
	long long l,r,maxn;
	long long add,cover;
}tree[5001000];
void build(long long l,long long r,long long idx){
	tree[idx].l=l;tree[idx].r=r;tree[idx].add=0;tree[idx].cover=1e18;
	if(tree[idx].l==tree[idx].r){tree[idx].maxn=arr[l];return;}
	long long mid=(l+r)>>1;
	build(l,mid,idx<<1);build(mid+1,r,idx<<1|1);
	tree[idx].maxn=max(tree[idx<<1].maxn,tree[idx<<1|1].maxn);
	return ;
}
void spread(long long idx){
	if(tree[idx].cover!=1e18){
		tree[idx<<1].maxn=tree[idx].cover;tree[idx<<1|1].maxn=tree[idx].cover;
		tree[idx<<1].cover=tree[idx].cover;tree[idx<<1|1].cover=tree[idx].cover;
		tree[idx<<1|1].add=0;tree[idx<<1|1].add=0;
	}
	if(tree[idx].add!=0){
		tree[idx<<1].maxn+=tree[idx].add;tree[idx<<1|1].maxn+=tree[idx].add;
		tree[idx<<1].add+=tree[idx].add;tree[idx<<1|1].add+=tree[idx].add;
	}
	tree[idx].cover=1e18;tree[idx].add=0;
	tree[idx].maxn=max(tree[idx<<1].maxn,tree[idx<<1|1].maxn);
	return;
}
void add(long long l,long long r,long long idx,long long w){
	if(tree[idx].l>r||tree[idx].r<l) return;
	if(tree[idx].l>=l&&tree[idx].r<=r){
		spread(idx);
		tree[idx].maxn+=w;
		tree[idx].add+=w;
		return;
	}
	spread(idx);
	add(l,r,idx<<1,w);add(l,r,idx<<1|1,w);
	tree[idx].maxn=max(tree[idx<<1].maxn,tree[idx<<1|1].maxn);
}
void cover(long long l,long long r,long long idx,long long w){
	if(tree[idx].l>r||tree[idx].r<l) return ;
	if(tree[idx].l>=l&&tree[idx].r<=r){
		tree[idx].maxn=w;tree[idx].add=0;
		tree[idx].cover=w;return;
	}
	spread(idx);
	cover(l,r,idx<<1,w);add(l,r,idx<<1|1,w);
	tree[idx].maxn=max(tree[idx<<1].maxn,tree[idx<<1|1].maxn);
	return ;
}
long long check(long long l,long long r,long long idx){
	if(tree[idx].l>r||tree[idx].r<l) return -1e16;
	if(tree[idx].l>=l&&tree[idx].r<=r){
		return tree[idx].maxn;	
	}
	spread(idx);
	tree[idx].maxn=max(tree[idx<<1].maxn,tree[idx<<1|1].maxn);
	return max(check(l,r,idx<<1),check(l,r,idx<<1|1));
}
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>arr[i];
	}
	build(1,n,1);
	while(q--){
		int op;long long l,r,x;
		cin>>op;
		if(op==1){cin>>l>>r>>x;cover(l,r,1,x);}
		if(op==2){cin>>l>>r>>x;add(l,r,1,x);}
		if(op==3){cin>>l>>r;cout<<check(l,r,1)<<endl;}
	}
	return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...