已经回收内存,为何MLE
查看原帖
已经回收内存,为何MLE
524369
netlify楼主2025/2/4 23:32
#include<bits/stdc++.h>
#define mid (l+r>>1)
#define max3(a,b,c) max(max(a,b),c)
using namespace std;
const int N=5e5+1;
int ls[N],rs[N],pri[N],siz[N],stk[N],cnt,rt,top;
struct node{
	int rev,set,val,maxv,maxl,maxr,sum;
}val[N];
void cover(int x,int v){
	val[x].val=v,val[x].sum=siz[x]*v;
	val[x].maxl=val[x].maxr=max(0,val[x].sum);
	val[x].maxv=max(v,val[x].sum);
	val[x].set=1;
}
void rev(int x){
	swap(ls[x],rs[x]),swap(val[x].maxl,val[x].maxr),val[x].rev^=1;
}
inline void d(int x){
	if(val[x].rev)
		rev(ls[x]),rev(rs[x]),val[x].rev=0;
	if(val[x].set)
		cover(ls[x],val[x].val),cover(rs[x],val[x].val),val[x].set=0;
}
inline void p(int x){
	siz[x]=siz[ls[x]]+siz[rs[x]]+1;
	val[x].sum=val[ls[x]].sum+val[rs[x]].sum+val[x].val;
	val[x].maxl=max3(val[ls[x]].maxl,val[ls[x]].sum+val[x].val+val[rs[x]].maxl,0);
	val[x].maxr=max3(val[rs[x]].maxr,val[rs[x]].sum+val[x].val+val[ls[x]].maxr,0);
	val[x].maxv=max3(val[ls[x]].maxv,val[rs[x]].maxv,max(val[ls[x]].maxr+val[rs[x]].maxl,0)+val[x].val);
}
inline int nd(int v){
	int id=top?stk[top--]:++cnt;
	val[id]=(node){0,0,v,v,max(0,v),max(0,v),v};
	siz[id]=1,pri[id]=rand();
	return id;
}
int m(int x,int y){
	if(!x||!y)return x+y;
	if(pri[x]<pri[y])
		return d(x),rs[x]=m(rs[x],y),p(x),x;
	else
		return d(y),ls[y]=m(x,ls[y]),p(y),y;
}
void s(int u,int k,int&x,int&y){
	if(!u)x=y=0;
	else{
		d(u);
		if(siz[ls[u]]<k)x=u,s(rs[u],k-siz[ls[u]]-1,rs[u],y);
		else y=u,s(ls[u],k,x,ls[u]);
		p(u);
	}
}
void splitrng(int l,int tot,int&x,int&y,int&z){
	x=y=z=0,s(rt,l-1,x,y),s(y,tot,y,z);
}
int build(vector<int>&a,int l,int r){
	if(l!=r)return m(build(a,l,mid),build(a,mid+1,r));
	else return nd(a[l]);
}
void del(int x){
	if(!x)return;
	stk[++top]=x,del(ls[x]),del(rs[x]);
}
int main(){
	int n,q;
	cin>>n>>q;
	vector<int>a(N);
	for(int i=1;i<=n;i++)cin>>a[i];
	rt=build(a,1,n);
	while(q--){
		string op;
		cin>>op;
		if(op=="INSERT"){
			int pos,tot;
			vector<int>a;
			cin>>pos>>tot;
			for(int t;tot--;)cin>>t,a.emplace_back(t);
			int x,y;
			s(rt,pos,x,y),rt=m(m(x,build(a,0,a.size()-1)),y);
		}else if(op=="DELETE"){
			int pos,tot;
			cin>>pos>>tot;
			int x,y,z;
			splitrng(pos,tot,x,y,z),del(y),rt=m(x,z);
		}else if(op=="MAKE-SAME"){
			int pos,tot,v;
			cin>>pos>>tot>>v;
			int x,y,z;
			splitrng(pos,tot,x,y,z);
			cover(y,v);
			rt=m(m(x,y),z);
		}else if(op=="REVERSE"){
			int pos,tot;
			cin>>pos>>tot;
			int x,y,z;
			splitrng(pos,tot,x,y,z);
			rev(y);
			rt=m(m(x,y),z);
		}else if(op=="GET-SUM"){
			int pos,tot;
			cin>>pos>>tot;
			int x,y,z;
			splitrng(pos,tot,x,y,z);
			cout<<val[y].sum<<"\n";
			rt=m(m(x,y),z);
		}else if(op=="MAX-SUM")
			cout<<val[rt].maxv<<"\n";
	}
	return 0;
}

RT,评测链接

2025/2/4 23:32
加载中...