线段树区间加历史最值错误求调,代码清晰,悬赏关注
  • 板块P4314 CPU 监控
  • 楼主flywatre
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/4/23 14:33
  • 上次更新2023/10/29 19:36:46
查看原帖
线段树区间加历史最值错误求调,代码清晰,悬赏关注
137508
flywatre楼主2023/4/23 14:33

rt

在我改出来之前找出问题的dalao加关注

#include<bits/stdc++.h>
using namespace std;
#define ls (u*2)
#define rs (u*2+1)
inline int rd(){
	int f=1,j=0;
	char w=getchar();
	while(!isdigit(w)){
		if(w=='-')f=-1;
		w=getchar();
	}
	while(isdigit(w)){
		j=j*10+w-'0';
		w=getchar();
	}
	return f*j;
}
const int N=100010;
int ma[N*4],ans[N*4];
int ad[N*4],cov[N*4],vis[N*4];
int adma[N*4],covma[N*4];
int n,m,sum[N];
inline void update(int u){
	ma[u]=max(ma[ls],ma[rs]);
	ans[u]=max(ans[u],max(ans[ls],ans[rs]));
	return ;
}
inline void pushdown(int u){
	ans[ls]=max(ans[ls],covma[u]);
	ans[rs]=max(ans[rs],covma[u]);
	covma[ls]=max(covma[u],covma[ls]);
	covma[rs]=max(covma[u],covma[rs]);
	covma[u]=INT_MIN;
	
	if(vis[u]){
		ad[ls]=ad[rs]=0,cov[ls]=cov[rs]=cov[u];
		ma[ls]=ma[rs]=cov[u];
		vis[ls]=vis[rs]=true,vis[u]=false;
	}
	
	ans[ls]=max(ans[ls],ma[ls]+adma[u]);
	ans[rs]=max(ans[rs],ma[rs]+adma[u]);
	adma[ls]+=adma[u],adma[rs]+=adma[u];
	adma[u]=0;
	
	ma[ls]+=ad[u],ma[rs]+=ad[u];
	ad[ls]+=ad[u],ad[rs]+=ad[u];
	ad[u]=0;
	return ;
}
void built(int u,int l,int r){
	covma[u]=ans[u]=INT_MIN;
	if(l==r)return ma[u]=ans[u]=sum[l],void();
	int mid=(l+r)/2;
	built(ls,l,mid),built(rs,mid+1,r);
	update(u);
	return ;
}
void modifyp(int u,int l,int r,int L,int R,int sumn){
	if(L<=l&&r<=R){
		ma[u]+=sumn,ad[u]+=sumn;
		adma[u]=max(adma[u],ad[u]);
		ans[u]=max(ans[u],ma[u]);
		return ;
	}
	pushdown(u);
	int mid=(l+r)/2;
	if(L<=mid)modifyp(ls,l,mid,L,R,sumn);
	if(R>mid)modifyp(rs,mid+1,r,L,R,sumn);
	update(u);
	return ;
}
void modifyc(int u,int l,int r,int L,int R,int sumn){
	if(L<=l&&r<=R){
		if(l!=r)pushdown(u);
		vis[u]=true,cov[u]=sumn;
		ma[u]=sumn;
		covma[u]=max(covma[u],cov[u]);
		ans[u]=max(ans[u],ma[u]);
		if(l!=r)pushdown(u);
		return ;
	}
	pushdown(u);
	int mid=(l+r)/2;
	if(L<=mid)modifyc(ls,l,mid,L,R,sumn);
	if(R>mid)modifyc(rs,mid+1,r,L,R,sumn);
	update(u);
	return ;
}
int queryq(int u,int l,int r,int L,int R){
	if(L<=l&&r<=R)return ma[u];
	pushdown(u);
	int mid=(l+r)/2,ansn=INT_MIN;
	if(L<=mid)ansn=max(ansn,queryq(ls,l,mid,L,R));
	if(R>mid)ansn=max(ansn,queryq(rs,mid+1,r,L,R));
	return ansn;
}
int querya(int u,int l,int r,int L,int R){
	if(L<=l&&r<=R)return ans[u];
	pushdown(u);
	int mid=(l+r)/2,ansn=INT_MIN;
	if(L<=mid)ansn=max(ansn,querya(ls,l,mid,L,R));
	if(R>mid)ansn=max(ansn,querya(rs,mid+1,r,L,R));
	return ansn;
}
void bug(int u,int l,int r){
	cout<<u<<":"<<l<<" "<<r<<":"<<ma[u]<<" "<<ans[u]<<"\n";
	if(l==r)return ;
	int mid=(l+r)/2;
	bug(ls,l,mid),bug(rs,mid+1,r);
	return ;
}
char s[10];
signed main(){
	n=rd();
	for(int i=1;i<=n;i++)sum[i]=rd();
	built(1,1,n);
	m=rd();
	for(int i=1;i<=m;i++){
		scanf("%s",s+1);
		if(s[1]=='Q'){
			int l=rd(),r=rd();
			printf("%d\n",queryq(1,1,n,l,r));
		}
		else if(s[1]=='A'){
			int l=rd(),r=rd();
			printf("%d\n",querya(1,1,n,l,r));
		}
		else if(s[1]=='P'){
			int l=rd(),r=rd(),z=rd();
			modifyp(1,1,n,l,r,z);
		}
		else{
			int l=rd(),r=rd(),z=rd();
			modifyc(1,1,n,l,r,z);
		}
//		bug(1,1,n);
	}
	return 0;
}
/*
10
-12 -10 -10 -7 -11 -8 -12 -7 -10 -4 
5 
Q 5 9 
Q 1 1 
C 1 9 -1 
A 6 7 
C 6 7 6
*/
2023/4/23 14:33
加载中...