社区讨论

玄关求条线段树,20分,码风良好

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mm4as0t7
此快照首次捕获于
2026/02/27 10:53
2 周前
此快照最后确认于
2026/02/28 19:50
上周
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N=1e6+5;
const ll INF=1e18;
int n,q;
ll a[N],segtr[N<<2],tag1[N<<2],tag2[N<<2];
void push_down(int rt,int l,int r){
	if(l==r)return;
	if(tag1[rt]!=INF)tag2[rt<<1]=tag2[rt<<1|1]=0,segtr[rt<<1]=segtr[rt<<1|1]=tag1[rt<<1]=tag1[rt<<1|1]=tag1[rt],tag1[rt]=INF;
	if(tag2[rt]!=0)segtr[rt<<1]+=tag2[rt],segtr[rt<<1|1]+=tag2[rt],tag1[rt<<1]+=tag2[rt],tag1[rt<<1|1]+=tag2[rt],tag2[rt]=0;
}
void build(int rt,int l,int r){
	tag1[rt]=INF,tag2[rt]=0;
	if(l==r){
		segtr[rt]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	segtr[rt]=max(segtr[rt<<1],segtr[rt<<1|1]);
}
void update(int rt,int l,int r,int ql,int qr,int op,ll x){
	if(ql<=l&&r<=qr){
		if(op==1)tag1[rt]=segtr[rt]=x,tag2[rt]=0;
		else{
			if(tag1[rt]!=INF)tag1[rt]+=x;
			else tag2[rt]+=x;
			segtr[rt]+=x;
		}
		return;
	}
	push_down(rt,l,r);
	int mid=l+r>>1;
	if(ql<=mid)update(rt<<1,l,mid,ql,qr,op,x);
	if(qr>mid)update(rt<<1|1,mid+1,r,ql,qr,op,x);
	segtr[rt]=max(segtr[rt<<1],segtr[rt<<1|1]);
}
ll query(int rt,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr)return segtr[rt];
	push_down(rt,l,r);
	int mid=l+r>>1;
	ll res=-INF;
	if(ql<=mid)res=max(res,query(rt<<1,l,mid,ql,qr));
	if(qr>mid)res=max(res,query(rt<<1|1,mid+1,r,ql,qr));
	return res;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;++i)cin>>a[i];
	build(1,1,n);
	while(q--){
		int op,l,r;
		cin>>op>>l>>r;
		if(op==1){
			ll x;
			cin>>x;
			update(1,1,n,l,r,op,x);
		}else if(op==2){
			ll x;
			cin>>x;
			update(1,1,n,l,r,op,x);
		}else{
			cout<<query(1,1,n,l,r)<<endl;
		}
	}
	return 0;
}
已过样例,20分,可以关注。

回复

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

正在加载回复...