为什么会MLE呢?
查看原帖
为什么会MLE呢?
497275
trp_hy楼主2023/2/6 19:17
#include<bits/stdc++.h>
#define N 500005
#define inf 2000000000
using namespace std;

string str;
int tot,rt,n,m,a,b,c,x,y,t;
int w[N],ch[N][2],val[N],num[N],sz[N];
int ls[N],rs[N],s[N],mx[N],l1[N],l2[N];
int st[N],top;

inline int read(){
	int x=0,w=0; char c=0;
	while(!isdigit(c)){w|=c=='-';c=getchar();}
	while(isdigit(c)){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return w?-x:x;
}

inline void pushup(int p){
	if(!ch[p][0]&&!ch[p][1]){
		sz[p]=1;
		s[p]=ls[p]=rs[p]=mx[p]=val[p];
	}else if(!ch[p][1]){
		sz[p]=sz[ch[p][0]]+1;
		s[p]=s[ch[p][0]]+val[p];
		ls[p]=max(ls[ch[p][0]],s[p]);
		rs[p]=max(0,rs[ch[p][0]])+val[p];
		mx[p]=max(mx[ch[p][0]],rs[p]);
	}else if(!ch[p][0]){
		sz[p]=sz[ch[p][1]]+1;
		s[p]=s[ch[p][1]]+val[p];
		rs[p]=max(rs[ch[p][1]],s[p]);
		ls[p]=max(0,ls[ch[p][1]])+val[p];
		mx[p]=max(mx[ch[p][1]],ls[p]);
	}else{
		ls[p]=max(ls[ch[p][0]],s[ch[p][0]]+ls[ch[p][1]]+val[p]);
		rs[p]=max(rs[ch[p][1]],s[ch[p][1]]+rs[ch[p][0]]+val[p]);
		s[p]=s[ch[p][0]]+s[ch[p][1]]+val[p];
		mx[p]=max(max(mx[ch[p][0]],mx[ch[p][1]]),rs[ch[p][0]]+val[p]+ls[ch[p][1]]);
		sz[p]=sz[ch[p][0]]+sz[ch[p][1]]+1;
	}
	if(ls[p]<0) ls[p]=0;
	if(rs[p]<0) rs[p]=0;
}

inline void pushdown(int p){
	if(l1[p]){
		l1[ch[p][0]]^=1;
		l1[ch[p][1]]^=1;
		swap(ch[ch[p][0]][0],ch[ch[p][0]][1]);
		swap(ch[ch[p][1]][0],ch[ch[p][1]][1]);
		swap(ls[ch[p][0]],rs[ch[p][0]]);
		swap(ls[ch[p][1]],rs[ch[p][1]]);
		l1[p]=0;
	}
	if(l2[p]!=inf){
		l2[ch[p][0]]=l2[p];
		l2[ch[p][1]]=l2[p];
		s[ch[p][0]]=sz[ch[p][0]]*l2[p];
		ls[ch[p][0]]=rs[ch[p][0]]=mx[ch[p][0]]=s[ch[p][0]];
		s[ch[p][1]]=sz[ch[p][1]]*l2[p];
		ls[ch[p][1]]=rs[ch[p][1]]=mx[ch[p][1]]=s[ch[p][1]];
		val[ch[p][0]]=val[ch[p][1]]=l2[p];
		if(ls[ch[p][0]]<0) ls[ch[p][0]]=0;
		if(ls[ch[p][1]]<0) ls[ch[p][1]]=0;
		if(rs[ch[p][0]]<0) rs[ch[p][0]]=0;
		if(rs[ch[p][1]]<0) rs[ch[p][1]]=0;
		l2[p]=inf;
	}
}

inline int node(int k){
	int id;
	if(!top) id=++tot;
	else id=st[top--];
	num[id]=rand();
	s[id]=val[id]=mx[id]=ls[id]=rs[id]=k;
	ch[id][0]=ch[id][1]=0;
	sz[id]=1;
	l1[id]=0;
	l2[id]=inf;
	if(ls[id]<0) ls[id]=0;
	if(rs[id]<0) rs[id]=0;
	return id;
}

inline void split(int now,int k,int &x,int &y){
	if(!now) x=y=0;
	else{
		pushdown(now);
		int tmp=sz[ch[now][0]]+1;
		if(tmp<=k){
			x=now;
			split(ch[x][1],k-tmp,ch[x][1],y);
		}else{
			y=now;
			split(ch[y][0],k,x,ch[y][0]);
		}
		pushup(now);
	}
}

inline int merge(int x,int y){
	if(!x||!y) return x|y;
	if(num[x]<num[y]){
		pushdown(x);
		ch[x][1]=merge(ch[x][1],y);
		pushup(x);
		return x;
	}else{
		pushdown(y);
		ch[y][0]=merge(x,ch[y][0]);
		pushup(y);
		return y;
	}
}

inline int build(int l,int r){
	if(l>r) return 0;
	int mid=l+r>>1;
	int p=node(w[mid]);
	ch[p][0]=build(l,mid-1);
	ch[p][1]=build(mid+1,r);
	pushup(p);
	return p;
}

inline void print(int p){
	if(!p) return;
	print(ch[p][0]);
	st[++top]=p;
	print(ch[p][1]);
}

signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;++i) w[i]=read();
	rt=build(1,n);
	while(m--){
		cin>>str;
		if(str=="INSERT"){
			x=read(),y=read();
			for(int i=1;i<=y;++i) w[i]=read();
			split(rt,x,a,b);
			rt=merge(a,merge(build(1,y),b));
		}else if(str=="DELETE"){
			x=read(),y=read();
			split(rt,x-1,a,b);
			split(b,y,b,c);
			print(y);
			rt=merge(a,c);
		}else if(str=="REVERSE"){
			x=read(),y=read();
			split(rt,x-1,a,b);
			split(b,y,b,c);
			l1[b]^=1;
			swap(ch[b][0],ch[b][1]);
			swap(ls[b],rs[b]);
			rt=merge(merge(a,b),c); 
		}else if(str=="MAKE-SAME"){
			x=read(),y=read(),t=read();
			split(rt,x-1,a,b);
			split(b,y,b,c);
			val[b]=l2[b]=t;
			s[b]=sz[b]*t;
			ls[b]=rs[b]=mx[b]=s[b];
			rt=merge(merge(a,b),c); 
		}else if(str=="GET-SUM"){
			x=read(),y=read();
			split(rt,x-1,a,b);
			split(b,y,b,c);
			printf("%d\n",s[b]);
			rt=merge(merge(a,b),c);
		}else if(str=="MAX-SUM"){
			printf("%d\n",mx[rt]);
		}else{
			x=read();
			split(rt,x-1,a,b);
			int ans=b;
			while(ch[ans][0]) ans=ch[ans][0];
			printf("%d\n",val[ans]);
			rt=merge(a,b);
		}
	}
	return 0;
}

2023/2/6 19:17
加载中...