线段树24分求调
查看原帖
线段树24分求调
544654
momo233142楼主2022/11/18 11:53

讨论里的几个hack都能过

#include<bits/stdc++.h>
#define ls x<<1
#define rs x<<1|1
#define mid (l+r)/2
using namespace std;
int n,m,f[500100<<2],b[500100<<2],a[500100],opt,x,y,z,mh[500100<<2],ih[500100<<2];
void build(int x,int l,int r){
	mh[x]=ih[x]=-0x3f3f3f3f;
	if(l==r){
		f[x]=a[l];
		return;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	f[x]=max(f[ls],f[rs]);
}
void zou(int x,int l,int r,int k,int mk,int ik){
	if(mk!=-0x3f3f3f3f){
		if(f[x]>mk){
			f[x]=mk;
			mh[x]=mk;b[x]=0;
		}
//		b[x]=mk-f[x];
	}
	if(ik!=-0x3f3f3f3f){
		if(f[x]<ik){
			f[x]=ik;
			ih[x]=ik;b[x]=0;
		}
//		b[x]=ik-f[x];
	}
	f[x]+=k;
	b[x]+=k;
}
void biaoji(int x,int l,int r){
	zou(ls,l,mid,b[x],mh[x],ih[x]);
	zou(rs,mid+1,r,b[x],mh[x],ih[x]);
	b[x]=0;mh[x]=-0x3f3f3f3f;ih[x]=-0x3f3f3f3f;
}
int cha(int x,int l,int r,int ll,int rr){
	if(ll<=l&&r<=rr){
		return f[x];
	}
	biaoji(x,l,r);
	int ans=-0x3f3f3f3f;
	if(ll<=mid)ans=max(ans,cha(ls,l,mid,ll,rr));
	if(rr>mid)ans=max(ans,cha(rs,mid+1,r,ll,rr));
	return ans;
}
void jia(int x,int l,int r,int ll,int rr,int k){
	if(ll<=l&&r<=rr){
		f[x]+=k;
//		if(mh[x]!=-0x3f3f3ff3)mh[x]+=k;
//		if(ih[x]!=-0x3f3f3f3f)ih[x]+=k;
		b[x]+=k;
		return ;
	}
	biaoji(x,l,r);
	if(ll<=mid)jia(ls,l,mid,ll,rr,k);
	if(rr>mid)jia(rs,mid+1,r,ll,rr,k);
	f[x]=max(f[ls],f[rs]);
}
void xiangao(int x,int l,int r,int ll,int rr,int k){
	if(ll<=l&&r<=rr){
		if(f[x]>k){
			f[x]=k;
			b[x]=0;
			mh[x]=k;ih[x]=-0x3f3f3f3f;
		}
		return ;
	}
	biaoji(x,l,r);
	if(ll<=mid)xiangao(ls,l,mid,ll,rr,k);
	if(rr>mid)xiangao(rs,mid+1,r,ll,rr,k);
	f[x]=max(f[ls],f[rs]);
}
void xiandi(int x,int l,int r,int ll,int rr,int k){
	if(ll<=l&&r<=rr){
		if(f[x]<k){
			f[x]=k;
			b[x]=0;
			ih[x]=k;mh[x]=-0x3f3f3f3f;
		}
		return ;
	}
	biaoji(x,l,r);
	if(ll<=mid)xiandi(ls,l,mid,ll,rr,k);
	if(rr>mid)xiandi(rs,mid+1,r,ll,rr,k);
	f[x]=max(f[ls],f[rs]);
}
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	build(1,1,n);
	while(m--){
		scanf("%d",&opt);
		if(opt==1){
			scanf("%d%d%d",&x,&y,&z);
			jia(1,1,n,x,y,z);
//			puts("---");
//			for(int i=1;i<=n;i++){
//				cout<<cha(1,1,n,i,i)<<" ";
//			}puts("");
//			puts("---");
		}else if(opt==2){
			scanf("%d%d%d",&x,&y,&z);
			xiangao(1,1,n,x,y,z);
		}else if(opt==3){
			scanf("%d%d%d",&x,&y,&z);
			xiandi(1,1,n,x,y,z);
		}else{
			scanf("%d%d",&x,&y);
			cout<<cha(1,1,n,x,y)<<endl;
		}
//		puts("---");
//		for(int i=1;i<=n;i++){
//			cout<<cha(1,1,n,i,i)<<" ";
//		}puts("");
//		puts("---");
	}
	return 0;
}
2022/11/18 11:53
加载中...