60分求调,刚学线段树
查看原帖
60分求调,刚学线段树
690315
array2022楼主2024/5/25 16:40

代码可能有些丑,希望不要介意。 最后 4 个点 WA。

#include<bits/stdc++.h>
using namespace std;
long long d[4000005],a[1000005],t_add[4000005],t_chan[4000005],n,q;
bool b[4000005];
void build(long long s,long long t,long long p){
	if (s==t){
		d[p]=a[s]; return;
	}
	long long mid=(s+t)/2;
	build(s,mid,p*2); build(mid+1,t,p*2+1);
	d[p]=max(d[p*2],d[p*2+1]);
}
long long gmax(long long l,long long r,long long s,long long t,long long p){
	if (l<=s&&t<=r) return d[p];
	long long mid=(s+t)/2,bi=-1e17;
	if (t_add[p]!=0){
		d[p*2]+=t_add[p]; d[p*2+1]+=t_add[p];
		t_add[p*2]+=t_add[p]; t_add[p*2+1]+=t_add[p]; t_add[p]=0;
	}
	if (b[p]&&s!=t){
		d[p*2]=d[p*2+1]=t_chan[p];
		t_chan[p*2]=t_chan[p*2+1]=t_chan[p];
		b[p*2]=b[p*2+1]=1; b[p]=0;
	}
	if (l<=mid) bi=gmax(l,r,s,mid,p*2);
	if (r>mid){
		long long x=gmax(l,r,mid+1,t,p*2+1);
		bi=bi>x?bi:x;
	}
	return bi;
}
void ud_add(long long l,long long r,long long c,long long s,long long t,long long p){
	if (l<=s&&t<=r){
		d[p]+=c; t_add[p]+=c; return;
	}
	long long mid=(s+t)/2;
	if (t_add[p]!=0&&s!=t){
		if (b[p]){
			d[p*2]=d[p*2+1]=t_chan[p];
			t_chan[p*2]=t_chan[p*2+1]=t_chan[p];
			b[p*2]=b[p*2+1]=1; b[p]=0;
		}
		d[p*2]+=t_add[p]; d[p*2+1]+=t_add[p];
		t_add[p*2]+=t_add[p]; t_add[2*p+1]+=t_add[p]; t_add[p]=0;
	}
	if (l<=mid) ud_add(l,r,c,s,mid,p*2);
	if (r>mid) ud_add(l,r,c,mid+1,t,p*2+1);
	d[p]=max(d[p*2],d[p*2+1]);
}
void ud_chan(long long l,long long r, long long c,long long s,long long t,long long p){
	if (l<=s&&t<=r){
		d[p]=c; t_chan[p]=c; return;
	}
	long long mid=(s+t)/2;
	if (b[p]){
		t_add[p]=0;
		d[p*2]=d[p*2+1]=t_chan[p];
		t_chan[p*2]=t_chan[p*2+1]=t_chan[p];
		b[p*2]=b[p*2+1]=1; b[p]=0;
	}
	if (l<=mid) ud_chan(l,r,c,s,mid,p*2);
	if (r>mid) ud_chan(l,r,c,mid+1,t,p*2+1);
	d[p]=max(d[p*2],d[p*2+1]);
}
int main(){
	scanf("%lld%lld",&n,&q);
	for (long long i=1;i<=n;i++){
		scanf("%lld",a+i);
	}
	build(1,n,1);
	long long op,l,r,x;
	for (long long i=0;i<q;i++){
		scanf("%lld",&op);
		switch (op){
			case 1:{
				scanf("%lld%lld%lld",&l,&r,&x);
				b[1]=1;
				ud_chan(l,r,x,1,n,1);
				break;
			}
			case 2:{
				scanf("%lld%lld%lld",&l,&r,&x);
				ud_add(l,r,x,1,n,1);
				break;
			}
			case 3:{
				scanf("%lld%lld",&l,&r);
				printf("%lld\n",gmax(l,r,1,n,1));
				break;
			}
		}
	}
	return 0;
}
2024/5/25 16:40
加载中...