夜已深,蒟蒻真的调不动了
查看原帖
夜已深,蒟蒻真的调不动了
241817
Chancylaser楼主2022/10/25 01:08

应该是码风清奇,通俗易懂了。
1,2,5,7,8WA。9,10TLE。3,4,6AC
要去睡觉了,离线等

#include<bits/stdc++.h>
#define int long long
#define MAX 8e18
using namespace std;
const int N = 4e6+5,M=123456555566667;

int read(){
	int x=0ll,f=1ll;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

int n,m;
int a[N];

struct qwq{
	int l,r;
	int sum,lazy; 		// 区间和,懒标记
	int fz;       		//区间赋值 M为原始状态 
	int minn,maxx,oldm;//最小,最大值,历史最大值 

	qwq(){
		l=r=0ll;
		sum=lazy=oldm=0ll;
		fz=M; minn=MAX; maxx=-MAX;
	}
	
	void color(int v,int bk){
		int len=r-l+1;		
		if(bk!=M){
			oldm=max(oldm,bk);
			lazy=0ll; 
			sum=bk*len;
			minn=maxx=fz=bk;
		}
		sum=(sum+v*len);	
		lazy+=v; minn+=v; maxx+=v;	
		oldm=max(maxx,oldm);
	}
}t[N];
qwq operator+(const qwq &a,const qwq &b){
	qwq c;
	c.l=a.l; c.r=b.r;
	c.sum=(a.sum+b.sum);
	c.minn=min(a.minn,b.minn);
	c.maxx=max(a.maxx,b.maxx);
	c.oldm=max(a.oldm,b.oldm);
	return c;
}

void build(int p,int l,int r){
	t[p].l=l,t[p].r=r;		
	if(l==r){
		t[p].maxx=t[p].minn=
		 t[p].sum=t[p].oldm=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	
	t[p]=t[p<<1]+t[p<<1|1];
}

void pushdown(int p){
	if(t[p].fz!=M||t[p].lazy!=0ll){
		t[p<<1].color(t[p].lazy,t[p].fz);
		t[p<<1|1].color(t[p].lazy,t[p].fz);
		t[p].lazy=0ll,t[p].fz=M;
	}
}
void updata(int p,int l,int r,int v){
	if(t[p].l>r||t[p].r<l) return;
	if(t[p].l>=l&&t[p].r<=r){
		t[p].color(v,M);
		return;
	}
	pushdown(p);
	
	updata(p<<1,l,r,v);
	updata(p<<1|1,l,r,v);
	t[p]=t[p<<1]+t[p<<1|1];
}

void updata2(int p,int l,int r,int v){ //区间内每个数与v 比较谁更小,然后赋值 
	if(t[p].l>r||t[p].r<l||t[p].maxx<=v) return;
	if(t[p].l>=l&&t[p].r<=r&&t[p].minn>=v){
		t[p].color(0,v);
		return;
	}
	if(t[p].l==t[p].r) return;
	
	pushdown(p);
	
	updata2(p<<1,l,r,v);
	updata2(p<<1|1,l,r,v);
	t[p]=t[p<<1]+t[p<<1|1];
}

int Gans1(int p,int l,int r){//区间和 
	if(t[p].l>r||t[p].r<l) return 0ll;
	if(t[p].l>=l&&t[p].r<=r) return t[p].sum;
	pushdown(p);
		
	return Gans1(p<<1,l,r)+Gans1(p<<1|1,l,r);	
}

int Gans4(int p,int l,int r){//最大值 
	if(t[p].l>r||t[p].r<l) return -MAX;
	if(t[p].l>=l&&t[p].r<=r) return t[p].maxx;
	pushdown(p);
	
	return max(Gans4(p<<1,l,r),Gans4(p<<1|1,l,r));	
}


int Gans5(int p,int l,int r){//历史最大值 
	if(t[p].l>r||t[p].r<l) return -MAX;
	if(t[p].l>=l&&t[p].r<=r) return t[p].oldm;
	pushdown(p);
	
	return max(Gans5(p<<1,l,r),Gans5(p<<1|1,l,r));	
}
int opt,l,r,v;

signed main(){
	n=read();m=read();
	
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	
	for(int i=1;i<=m;i++){
		opt=read();l=read();
		if(opt==1){
			r=read();v=read();
			updata(1,l,r,v);
		}
		if(opt==2){
			r=read();v=read();
			updata2(1,l,r,v);
		} 
		if(opt==3){
			r=read();
			printf("%lld\n",Gans1(1,l,r));
		}
		if(opt==4){
			r=read();
			printf("%lld\n",Gans4(1,l,r));
		}
		if(opt==5){
			r=read();
			printf("%lld\n",Gans5(1,l,r));
		}
	}
	return 0;
}
2022/10/25 01:08
加载中...