代码求调
查看原帖
代码求调
1030875
born_to_sun楼主2024/4/1 17:17

WA # 1 2 3 4 9 10,只有A询问出错

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=4e5+5;
long long a[N];
int ls[N],rs[N];
int tot,rt;
long long mx[N];
long long hm[N];
long long to[N],ad[N],th[N],ah[N];
void up(int u){
	mx[u]=max(mx[ls[u]],mx[rs[u]]);
	hm[u]=max(hm[ls[u]],hm[rs[u]]);
}
void build(int s,int t,int &u){
	if(!u) u=++tot;
	if(s==t){
		hm[u]=mx[u]=a[s];return;
	}
	int mid=s+t>>1;
	build(s,mid,ls[u]);
	build(mid+1,t,rs[u]);
	up(u);
}
void pushdown(int u,int s,int t){
	if(ah[u]>-1e18){
		hm[ls[u]]=max(hm[ls[u]],mx[ls[u]]+ah[u]);
		hm[rs[u]]=max(hm[rs[u]],mx[rs[u]]+ah[u]);
		ah[ls[u]]=max(ah[u]+ad[ls[u]],ah[ls[u]]);
		ah[rs[u]]=max(ah[u]+ad[rs[u]],ah[rs[u]]);
//		ah[u]=-2e18;
		ah[u]=0;
	}
	if(ad[u]){
		mx[ls[u]]+=ad[u];
		mx[rs[u]]+=ad[u];
		ad[ls[u]]+=ad[u];
		ad[rs[u]]+=ad[u];
		ad[u]=0;
	}
	if(to[u]>-1e18){
		mx[ls[u]]=mx[rs[u]]=to[u];
		to[ls[u]]=to[rs[u]]=to[u];
		to[u]=-2e18;
	}
	if(th[u]>-1e18){
		hm[ls[u]]=max(th[u],hm[ls[u]]);
		hm[rs[u]]=max(th[u],hm[rs[u]]);
		th[ls[u]]=max(th[ls[u]],th[u]);
		th[rs[u]]=max(th[rs[u]],th[u]);
		th[u]=-2e18;
	}
}
long long query(int l,int r,int s,int t,int u,char op){
	if(l<=s&&t<=r){
		if(op=='Q') return mx[u];
		else return hm[u];
	}
	pushdown(u,s,t);
	long long res=-1e18;
	int mid=s+t>>1;
	if(l<=mid) res=max(res,query(l,r,s,mid,ls[u],op));
	if(r>mid) res=max(res,query(l,r,mid+1,t,rs[u],op));
	up(u);
	return res;
}
void add(int l,int r,int s,int t,int u,long long val,char op){
	if(l<=s&&t<=r){
		if(op=='P'){//++
			if(to[u]>-1e18){
				to[u]+=val;
			}
			else{
				ad[u]+=val;
				ah[u]=max(ah[u],ad[u]);
			}
			mx[u]+=val;
			
			hm[u]=max(hm[u],mx[u]);
			th[u]=max(th[u],to[u]);
			
		}
		else{//赋值
			to[u]=val;
			mx[u]=val;
			
			hm[u]=max(hm[u],mx[u]);
			th[u]=max(th[u],to[u]);
		}
		
		return;
	}
	pushdown(u,s,t);
	int mid=s+t>>1;
	if(l<=mid) add(l,r,s,mid,ls[u],val,op);
	if(r>mid) add(l,r,mid+1,t,rs[u],val,op);
	up(u);
}
int main(){
//	freopen("t.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n,rt);
	for(int i=0;i<=4e5;i++){
		to[i]=-2e18;
		th[i]=-2e18;
//		ah[i]=-2e18;
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		char op;int x,y,z;cin>>op>>x>>y;
		if(op=='Q'||op=='A'){
//			cout<<op;
			cout<<query(x,y,1,n,rt,op);
			cout<<'\n';
		}
		else{
			cin>>z;
			add(x,y,1,n,rt,z,op);
		}
	}
	return 0; 
}
2024/4/1 17:17
加载中...