MnZn求调 fhq treap wa+re
查看原帖
MnZn求调 fhq treap wa+re
749714
xyzfrozen楼主2023/1/6 20:01
#include<bits/stdc++.h>
using namespace std;

const int N=5e5+10;
int n,m,idx,rt,tot,pos,c,l,r,mid,inf=INT_MAX;
int q[N],st;
struct node{
	int ls,rs;
	int val,heap,s;
	int rever,same;
	int maxl,maxr,maxt,sum;
}tr[N];

int add(int val)
{
	int k=(st?q[st--]:++idx);
	tr[k]={0,0,val,rand(),1,0,inf,max(val,0),max(val,0),val,val};
	return k;
}

void recycle(int now)
{
	node &t=tr[now];
	q[++st]=now;
	if(t.ls) recycle(t.ls);
	if(t.rs) recycle(t.rs);
}

void chf(int now)
{
	node &t=tr[now],&ls=tr[tr[now].ls],&rs=tr[tr[now].rs];
	t.s=ls.s+rs.s+1;
	t.sum=ls.sum+rs.sum+t.val;
	t.maxt=max(max(ls.maxt,rs.maxt),ls.maxr+t.val+rs.maxl);
	t.maxl=max(ls.maxl,ls.sum+t.val+rs.maxl);
	t.maxr=max(rs.maxr,rs.sum+t.val+ls.maxr);
}

void chs(int now)
{
	if(!now) return;
	node &t=tr[now],&ls=tr[t.ls],&rs=tr[t.rs];
	if(t.same!=inf)
	{
		int val=t.same;
		ls.val=rs.val=ls.same=rs.same=val;
		ls.sum=ls.s*val,rs.sum=rs.s*val;
		ls.maxt=max(val,ls.sum); //最大字段和不能为空 如果val为负数 只选自己
		rs.maxt=max(val,rs.sum);
		ls.maxl=ls.maxr=max(0,ls.sum); //最大前后缀可以为空
		rs.maxl=rs.maxr=max(0,rs.sum);
		ls.rever=rs.rever=0;
		t.same=inf;
	}
	if(t.rever)
	{
		swap(t.ls,t.rs);
		swap(t.maxl,t.maxr);
		ls.rever^=1,rs.rever^=1;
		t.rever=0;
	}
}

int fr(){
	int x=0,flag=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){
		if(ch=='-') flag=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*flag;
}

void split(int now,int size,int &l,int &r)
{
	if(!now) l=r=0;
	else
	{
		chs(now);
		if(tr[tr[now].ls].s+1<=size)
		{
			l=now;
			split(tr[now].rs,size-tr[tr[now].ls].s-1,tr[now].rs,r);
		}
		else
		{
			r=now;
			split(tr[now].ls,size,l,tr[now].ls);
		}
		chf(now);
	}
}

int merge(int l,int r)
{
	if(!l || !r) return l+r;
	else
	{
		if(tr[l].heap>tr[r].heap)
		{
			chs(l);
			tr[l].rs=merge(tr[l].rs,r);
			chf(l);
			return l;
		}
		else
		{
			chs(r);
			tr[r].ls=merge(l,tr[r].ls);
			chf(r);
			return r;
		}
	}
}

void output(int now)
{
	if(!now) return;
	chs(now);
	output(tr[now].ls);
	printf("%d ",tr[now].val);
	output(tr[now].rs);
}

int main()
{
	cin>>n>>m;
	tr[0].maxt=-inf;
	for(int i=1;i<=n;i++) rt=merge(rt,add(fr()));
	for(int i=1;i<=m;i++)
	{
		string s;
		cin>>s;
		if(s[0]=='I')
		{
			pos=fr(),tot=fr();
			split(rt,pos,l,r);
			while(tot--) l=merge(l,add(fr()));
			rt=merge(l,r);
		}
		else if(s[0]=='D')
		{
			pos=fr(),tot=fr();
			split(rt,pos-1,l,r);
			split(r,tot,mid,r);
			//recycle(mid);
			rt=merge(l,r);
		}
		else if(s=="MAKE-SAME")
		{
			pos=fr(),tot=fr(),c=fr();
			split(rt,pos-1,l,r);
			split(r,tot,mid,r);
			tr[mid].same=tr[mid].val=c;
			rt=merge(merge(l,mid),r);
		}
		else if(s[0]=='R')
		{
			pos=fr(),tot=fr();
			split(rt,pos-1,l,r);
			split(r,tot,mid,r);
			tr[mid].rever^=1;
			rt=merge(merge(l,mid),r);
		}
		else if(s[0]=='G')
		{
			pos=fr(),tot=fr();
			split(rt,pos-1,l,r);
			split(r,tot,mid,r);
			printf("%d\n",tr[mid].sum);
			rt=merge(merge(l,mid),r);
		}
		else
		{
			//output(rt);
			//puts("");
			//printf("%d\n",tr[rt].s);
			printf("%d\n",tr[rt].maxt);
		}
	}

	return 0;
}

hack

10 20
-231 259 -231 -919 -736 609 241 907 -676 -978
INSERT 0 4 987 348 686 -575
MAKE-SAME 7 2 -841
GET-SUM 5 1
MAKE-SAME 8 4 -742
MAX-SUM
MAKE-SAME 7 4 386
GET-SUM 1 5
MAKE-SAME 2 2 -36
MAX-SUM
GET-SUM 5 3
MAKE-SAME 10 2 579
MAX-SUM
INSERT 9 3 -822 -949 -505
GET-SUM 12 5
INSERT 5 4 934 -427 -839 660
DELETE 3 4
DELETE 5 4
REVERSE 2 8
MAKE-SAME 5 3 772
REVERSE 7 6

输出

-231
2021
1215
2077
414
2077
884

答案

-231
2021
1215
2077
414
3591
884
2023/1/6 20:01
加载中...