悬赏8关注,保证马蜂良好
查看原帖
悬赏8关注,保证马蜂良好
529038
Butterfly__qwq楼主2023/11/1 14:54
#include<bits/stdc++.h>
#define swp(a,b) ((a)^=(b)^=(a)^=(b))
using namespace std;
stack<int> s;
int rt,x,y,z,a[500005];
struct node
{
	int lc,rc,sz,w,cov,rnd;
	bool revlzy,covlzy;
	int sum,mxsum,mxprv,mxnxt;
}bl[500005];
int nd_init(int w=0)
{
	int u=s.top();
	s.pop();
	bl[u]={0,0,1,w,0,rand(),false,false,w,w,max(0,w),max(0,w)};
	return u;
}
void pushup(int u)
{
	if(u)
	{
		bl[u].sz=bl[bl[u].lc].sz+bl[bl[u].rc].sz+1;
		bl[u].sum=bl[bl[u].lc].sum+bl[bl[u].rc].sum+bl[u].w;
		bl[u].mxprv=max(0,max(bl[bl[u].lc].mxprv,bl[bl[u].lc].sum+bl[u].w+bl[bl[u].rc].mxprv));
		bl[u].mxnxt=max(0,max(bl[bl[u].rc].mxnxt,bl[bl[u].rc].sum+bl[u].w+bl[bl[u].lc].mxnxt));
		bl[u].mxsum=max(max(bl[u].w,bl[u].w+bl[bl[u].lc].mxnxt+bl[bl[u].rc].mxprv),max(bl[bl[u].lc].mxsum,bl[bl[u].rc].mxsum));
	}
}
void rev(int u)
{
	if(u)
	{
		swap(bl[u].lc,bl[u].rc);
		swap(bl[u].mxprv,bl[u].mxnxt);
		bl[u].revlzy^=1;
	}
}
void cov(int u,int w)
{
	bl[u].w=bl[u].cov=w;
	bl[u].sum=bl[u].sz*w;
	bl[u].mxprv=bl[u].mxnxt=max(0,bl[u].sum);
	bl[u].mxsum=max(w,bl[u].sum);
	bl[u].covlzy=true;
}
void pushdown(int u)
{
	if(u)
	{
		if(bl[u].revlzy)
		{
			rev(bl[u].lc);
			rev(bl[u].rc);
			bl[u].revlzy=false;
		}
		if(bl[u].covlzy)
		{
			cov(bl[u].lc,bl[u].cov);
			cov(bl[u].rc,bl[u].cov);
			bl[u].covlzy=false;
		}
	}
}
void split(int u,int rk,int &x,int &y)
{
	if(!u)
	{
		x=y=0;
		return;
	}
	pushdown(u);
	if(bl[bl[u].lc].sz<rk)
	{
		x=u;
		split(bl[x].rc,rk-bl[bl[u].lc].sz-1,bl[x].rc,y);
		pushup(x);
	}
	else
	{
		y=u;
		split(bl[y].lc,rk,x,bl[y].lc);
		pushup(y);
	}
}
int merge(int u,int v)
{
	if(!u||!v)return u+v;
	if(bl[u].rnd<bl[v].rnd)
	{
		pushdown(u);
		bl[u].rc=merge(bl[u].rc,v);
		pushup(u);
		return u;
	}
	else
	{
		pushdown(v);
		bl[v].lc=merge(u,bl[v].lc);
		pushup(v);
		return v;
	}
}
void del(int u)
{
	if(u)
	{
		s.push(u);
		del(bl[u].lc);
		del(bl[u].rc);
	}
}
int build(int l,int r)
{
	if(l==r)return nd_init(a[l]);
	int mid=l+r>>1;
	return merge(build(l,mid),build(mid+1,r));
}
int main()
{
	srand(time(0));
	bl[0].mxsum=bl[0].mxprv=bl[0].mxnxt=0xc0c0c0c0;
	int n,m,posi,tot,c;
	string op;
	cin>>n>>m;
	for(int i=500000;i;i--)s.push(i);
	for(int i=1;i<=n;i++)cin>>a[i];
	rt=merge(rt,build(1,n));
	while(m--)
	{
		cin>>op;
		if(op=="INSERT")
		{
			cin>>posi>>tot;
			for(int i=1;i<=tot;i++)cin>>a[i];
			split(rt,x,y,posi);
			rt=merge(merge(x,build(1,tot)),y);
		}
		if(op=="DELETE")
		{
			cin>>posi>>tot;
			split(rt,posi-1,x,y);
			split(y,tot,y,z);
			del(y);
			rt=merge(x,z);
		}
		if(op=="MAKE-SAME")
		{
			cin>>posi>>tot>>c;
			split(rt,posi-1,x,y);
			split(y,tot,y,z);
			cov(y,c);
			rt=merge(merge(x,y),z);
		}
		if(op=="REVERSE")
		{
			cin>>posi>>tot;
			split(rt,posi-1,x,y);
			split(y,tot,y,z);
			rev(y);
			rt=merge(merge(x,y),z);
		}
		if(op=="GET-SUM")
		{
			cin>>posi>>tot;
			split(rt,posi-1,x,y);
			split(y,tot,y,z);
			cout<<bl[y].sum<<'\n';
			rt=merge(merge(x,y),z);
		}
		if(op=="MAX-SUM")cout<<bl[rt].mxsum<<'\n';
	}
}
2023/11/1 14:54
加载中...