社区讨论

60tps求调,玄关

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@m01ux516
此快照首次捕获于
2024/08/20 11:20
2 年前
此快照最后确认于
2024/08/20 13:54
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+22;
void re(int &x){scanf("%lld",&x);}
void wr(int x){printf("%lld ",x);}
void cre(char ccc[]){scanf("%s",ccc+1);}
void cwr(char ccc[]){printf("%s",ccc+1);}
void enter(){putchar('\n');}
struct SegNode{
	int plu1,plu2,Sum,f;
};int SIGN=-1e18;
class SegTree{
	#define mid ((l+r)>>1)
	#define ls (x<<1)
	#define rs (x<<1|1)
	
	public:
	
	SegNode tree[(N<<2)+22];
		inline void pushupSum(int x){
			tree[x].Sum=max(tree[ls].Sum,tree[rs].Sum);
		}
		inline void downSumPlus(int x,int l,int r){
			tree[ls].plu1+=tree[x].plu1;
			tree[ls].Sum+=tree[x].plu1;
			tree[rs].plu1+=tree[x].plu1;
			tree[rs].Sum+=tree[x].plu1;
			tree[x].plu1=0;
		}
		inline void downSumEqual(int x,int l,int r){
			tree[ls].plu2=tree[x].plu2;
			tree[ls].Sum=tree[x].plu2;
			tree[ls].plu1=0;
			tree[rs].plu2=tree[x].plu2;
			tree[rs].Sum=tree[x].plu2;
			tree[rs].plu1=0;
			tree[x].f=0;
			tree[x].plu2=SIGN;
			tree[x].plu1=0;
		}
		
		inline void changeSumPlus(int x,int l,int r,int s,int t,int p){
			if(s<=l && r<=t){
				tree[x].Sum+=p;
				tree[x].plu1+=p;
				return ;
			}
			if(tree[x].plu1!=SIGN) downSumPlus(x,l,r);
			if(s<=mid) changeSumPlus(ls,l,mid,s,t,p);
			if(t>mid) changeSumPlus(rs,mid+1,r,s,t,p);
			pushupSum(x);
		}
		inline void changeSumEqual(int x,int l,int r,int s,int t,int p){
			if(s<=l && r<=t){
				tree[x].Sum=p;
				tree[x].f=1;
				tree[x].plu2=p;
				tree[x].plu1=0;
				return ;
			}
			if(tree[x].f!=0) downSumEqual(x,l,r);
			if(s<=mid) changeSumEqual(ls,l,mid,s,t,p);
			if(t>mid) changeSumEqual(rs,mid+1,r,s,t,p);
			pushupSum(x);
		}
		
		int SumQuery(int x,int l,int r,int s,int t){
			if(s<=l && r<=t) return tree[x].Sum;
			if(tree[x].f!=0) downSumEqual(x,l,r);
			if(tree[x].plu1!=0) downSumPlus(x,l,r);
			int ans=-1e18;
			if(s<=mid) ans=max(ans,SumQuery(ls,l,mid,s,t));
			if(t>mid) ans=max(ans,SumQuery(rs,mid+1,r,s,t));
			return ans;
		}
		
		inline void build(int x,int l,int r,int awa[]){
			if(l==r){
				tree[x].Sum=awa[l];
				return ;
			}
			build(ls,l,mid,awa);
			build(rs,mid+1,r,awa);
			pushupSum(x);
		}
		inline void SumEqual(int n,int l,int r,int p){return changeSumEqual(1,1,n,l,r,p);}
		inline void SumPlus(int n,int l,int r,int p){return changeSumPlus(1,1,n,l,r,p);}
		int SumQ(int n,int l,int r){return SumQuery(1,1,n,l,r);}
}STS;
int n,q,a[N];
signed main(){
	re(n),re(q);
	for(int i=1;i<=n;i++) re(a[i]);
	STS.build(1,1,n,a);
	while(q--){
		int x,y,z;
		re(x);
		if(x==1){
			re(x),re(y),re(z);
			STS.SumEqual(n,x,y,z);
		}else if(x==2){
			re(x),re(y),re(z);
			STS.SumPlus(n,x,y,z);
		}else{
			re(x),re(y);
			wr(STS.SumQ(n,x,y));
			enter();
		}
	}
}

回复

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

正在加载回复...