40分,问题大概知道了,但是不知道咋改求助
查看原帖
40分,问题大概知道了,但是不知道咋改求助
32490
memory_frv楼主2021/8/23 11:31

1346测试点过了,其他的测试点问题不是很大,总是在比较靠后的位置出错,初步判断是5操作出现了问题,但是不知道咋改呀,救救孩子吧

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 2147483646
using namespace std;
struct tree{
	int l,r,mx,mn,cmx,cmn,tmx,tmn,tad,smx,smn,mxb;
	long long sum;
}t[2000001];
int a[1000001];
inline void pushup(int root){
	int ls=root*2,rs=root*2+1;
	t[root].sum=t[ls].sum+t[rs].sum;
	t[root].mxb=max(t[ls].mxb,t[rs].mxb);
	if(t[ls].mx==t[rs].mx){
		t[root].mx=t[ls].mx;t[root].cmx=t[ls].cmx+t[rs].cmx;
		t[root].smx=max(t[ls].smx,t[rs].smx);
	}else if(t[ls].mx>t[rs].mx){
		t[root].mx=t[ls].mx;t[root].cmx=t[ls].cmx;
		t[root].smx=max(t[ls].smx,t[rs].mx);
	}else{
		t[root].mx=t[rs].mx;t[root].cmx=t[rs].cmx;
		t[root].smx=max(t[ls].mx,t[rs].smx);
	}
}
inline void pushadd(int root,int v){
	t[root].sum+=(t[root].r-t[root].l+1ll)*v;
	t[root].mx+=v,t[root].mn+=v;
	t[root].mxb=max(t[root].mxb,t[root].mx);
	if(t[root].smx!=-inf) t[root].smx+=v;
	if(t[root].smn!=inf) t[root].smn+=v;
	if(t[root].tmx!=-inf) t[root].tmx+=v;
	if(t[root].tmn!=inf) t[root].tmn+=v;
	t[root].tad+=v;
}
inline void pushmin(int root,int v){
	if(t[root].mx<=v) return ;
	t[root].sum+=(v*1ll-t[root].mx)*t[root].cmx;
	if(t[root].mn==t[root].mx) t[root].mn=v;
	if(t[root].smn==t[root].mx) t[root].smn=v;
	if(t[root].tmx>v) t[root].tmx=v;
	t[root].mx=v;t[root].tmn=v;
}
inline void pushmax(int root,int v){
	if(t[root].mn>v) return ;
	t[root].sum+=(v*1ll-t[root].mn)*t[root].cmn;
	if(t[root].mx==t[root].mn) t[root].mx=v;
	if(t[root].smx==t[root].mn) t[root].smx=v;
	if(t[root].tmn<v) t[root].tmn=v;
	t[root].mn=v;t[root].tmx=v;
}
inline void pushdown(int root){
	int mid=(t[root].l+t[root].r)/2;
	if(t[root].tad){
		pushadd(root*2,t[root].tad),pushadd(root*2+1,t[root].tad);
	}
	if(t[root].tmx!=-inf) pushmax(root*2,t[root].tmx),pushmax(root*2+1,t[root].tmx);
	if(t[root].tmn!=inf) pushmin(root*2,t[root].tmn),pushmin(root*2+1,t[root].tmn);
	t[root].tad=0,t[root].tmx=-inf,t[root].tmn=inf;
}
inline void build(int bg,int en,int root){
	t[root].l=bg,t[root].r=en,t[root].tmx=-inf,t[root].tmn=inf;
	if(bg==en){
		t[root].sum=t[root].mx=t[root].mn=t[root].mxb=a[bg];
		t[root].smx=-inf,t[root].smn=inf;
		t[root].cmx=t[root].cmn=1;
		return ;
	}
	int mid=(bg+en)/2;
	build(bg,mid,root*2);
	build(mid+1,en,root*2+1);
	pushup(root);
}
inline void add(int bg,int en,int root,int ad){
	if(bg<=t[root].l&&en>=t[root].r){
		return pushadd(root,ad);
	}
	int mid=(t[root].l+t[root].r)/2;
	pushdown(root);
	if(bg<=mid) add(bg,en,root*2,ad);
	if(en>mid) add(bg,en,root*2+1,ad);
	pushup(root);
}
inline void tomin(int bg,int en,int root,int v){
	if(t[root].l>en||t[root].r<bg||t[root].mx<=v) return ;
	if(bg<=t[root].l&&en>=t[root].r&&t[root].smx<v){
		return pushmin(root,v);
	}
	int mid=(t[root].l+t[root].r)/2;
	pushdown(root);
	tomin(bg,en,root*2,v);
	tomin(bg,en,root*2+1,v);
	pushup(root);
}
inline long long querysum(int bg,int en,int root){
	if(t[root].l>en||t[root].r<bg) return 0;
	if(bg<=t[root].l&&en>=t[root].r){
		return t[root].sum;
	}
	int mid=(t[root].l+t[root].r)/2;
	pushdown(root);
	return querysum(bg,en,root*2)+querysum(bg,en,root*2+1);
}
inline int qmaxa(int bg,int en,int root){
	if(t[root].l>en||t[root].r<bg) return -inf;
	if(bg<=t[root].l&&en>=t[root].r){
		return t[root].mx;
	}
	int mid=(t[root].l+t[root].r)/2;
	pushdown(root);
	return max(qmaxa(bg,en,root*2),qmaxa(bg,en,root*2+1));
}
inline int qmaxb(int bg,int en,int root){
	if(t[root].l>en||t[root].r<bg) return -inf;
	if(bg<=t[root].l&&en>=t[root].r){
		return t[root].mxb;
	}
	int mid=(t[root].l+t[root].r)/2;
	pushdown(root);
	return max(qmaxb(bg,en,root*2),qmaxb(bg,en,root*2+1));
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,n,1);
	for(int i=0;i<m;i++){
		int opt,u,v,w;
		scanf("%d%d%d",&opt,&u,&v);
		if(opt==1){
			scanf("%d",&w);
			add(u,v,1,w);
		}else if(opt==2){
			scanf("%d",&w);
			tomin(u,v,1,w);
		}else if(opt==3){
			printf("%lld\n",querysum(u,v,1));
		}else if(opt==4){
			printf("%d\n",qmaxa(u,v,1));
		}else{
			printf("%d\n",qmaxb(u,v,1));
		}
	}
	return 0;
}
2021/8/23 11:31
加载中...