平衡树求调
查看原帖
平衡树求调
716965
L_zaa_L楼主2023/11/20 15:08
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-f;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
const int inf=1e9;
mt19937 rnd(19260817); 
int n,m,node,rt;
int stac[500005],tp;
int lazy1[500005],lazy2[500005];
struct XXX{
	int l,r,key;
	int siz,val;
	int pre,suf;
	int sum,mx;
}tree[500005];
void modify(int x,int a,int b){
	tree[x].sum=a*b;
	tree[x].pre=tree[x].suf=max(0ll,tree[x].sum);
	tree[x].mx=(a<0?a:a*b);
}
int add(int x){
	int newid=(tp>0?stac[tp--]:++node);
	tree[newid].val=x;
	tree[newid].siz=1;tree[newid].key=rnd();
	tree[newid].pre=max(0ll,x);tree[newid].suf=max(0ll,x);
	tree[newid].sum=x;tree[newid].mx=x;
	return newid;
}
void pushdown(int x){
	if(lazy1[x]){
		lazy1[tree[x].l]^=1,lazy1[tree[x].r]^=1;
		swap(tree[tree[x].l].pre,tree[tree[x].l].suf);
		swap(tree[tree[x].r].pre,tree[tree[x].r].suf);
		swap(tree[x].l,tree[x].r);
		lazy1[x]=0;
	}
	if(lazy2[x]!=1e16){
		lazy2[tree[x].l]=lazy2[tree[x].r]=tree[tree[x].l].val=tree[tree[x].r].val=lazy2[x];
		modify(tree[x].l,lazy2[x],tree[tree[x].l].siz);
		modify(tree[x].r,lazy2[x],tree[tree[x].r].siz);
		lazy2[x]=1e16;
	}
}
void pushup(int x){
	if(!x) return;
	tree[x].siz=tree[tree[x].l].siz+tree[tree[x].r].siz+1;
	tree[x].sum=tree[tree[x].l].sum+tree[tree[x].r].sum+tree[x].val;
	tree[x].pre=max(max(tree[tree[x].l].pre,tree[tree[x].l].sum+tree[x].val+tree[tree[x].r].pre),0ll);
	tree[x].suf=max(max(tree[tree[x].r].suf,tree[tree[x].r].sum+tree[x].val+tree[tree[x].l].suf),0ll);
	tree[x].mx=max(tree[x].val,tree[x].val+tree[tree[x].l].suf+tree[tree[x].r].pre);
	if(tree[x].l) tree[x].mx=max(tree[x].mx,tree[tree[x].l].mx);
	if(tree[x].r) tree[x].mx=max(tree[x].mx,tree[tree[x].r].mx);
}
void split(int x,int k,int &l,int &r){
	if (!x){
		l=r=0;
		return;
	}
	pushdown(x);
	if(tree[tree[x].l].siz>=k){
		r=x;
		split(tree[x].l,x,l,tree[x].l);
	}
	else{
		l=x;
		split(tree[x].r,k-tree[tree[x].l].siz-1,tree[x].r,r);
	}
	pushup(x);
} 
int merge(int l,int r){
	if(!l||!r){
		return l+r;
	}
	pushdown(l);
	pushdown(r);
	if(tree[l].key<tree[r].key){
		tree[l].r=merge(tree[l].r,r);
		pushup(l);
		return l; 
	}
	else{
		tree[r].l=merge(l,tree[r].l);
		pushup(r);
		return r;
	}
}
void clean(int x){
	if(!x) return;
	clean(tree[x].l);clean(tree[x].r);
	tree[x]={0,0,0,0,0,-inf,-inf,0,-inf};
	lazy1[x]=0;
	lazy2[x]=0;
	stac[++tp]=x;
}
signed main(){
	tree[0]={0,0,0,0,-inf,-inf,0,-inf};
//	srand(time(0));
	n=read();
	int Q=read();
	for(int i=1;i<=n;i++){
		int x=read();
		rt=merge(rt,add(x));
	}
	while(Q--){
		string s;
		int x,y,z;
		cin>>s;
		if(s=="INSERT"){
			int p=read(),t=read();
			int gg=0,x=0,y=0;
			for(int i=1;i<=t;i++)
				gg=merge(gg,add(read()));
			split(rt,p,x,y);
			rt=merge(merge(x,gg),y);
		}
		if(s=="DELETE"){
			int p=read(),t=read();
			split(rt,p+t-1,x,z);
			split(x,p-1,x,y);
			clean(y);
			rt=merge(x,z);
		}
		if(s=="MAKE-SAME"){
			int p=read(),t=read();
			split(rt,p+t-1,x,z);
			split(x,p-1,x,y);
			lazy2[y]=tree[y].val=read();
			modify(y,tree[y].val,tree[y].siz);
			rt=merge(merge(x,y),z);
		}
		if(s=="REVERSE"){
			int p=read(),t=read();
			split(rt,p+t-1,x,z);
			split(x,p-1,x,y);
			lazy1[y]^=1;
			rt=merge(merge(x,y),z);
		}
		if(s=="GET-SUM"){
			int p=read(),t=read();
			split(rt,p+t-1,x,z);
			split(x,p-1,x,y);
			printf("%d\n",tree[y].sum);
			rt=merge(merge(x,y),z);
		}
		if(s=="MAX-SUM"){
			printf("%d\n",tree[rt].mx);
		}
	} 
	return 0;
}
2023/11/20 15:08
加载中...