fhq-treap 0pts求救
查看原帖
fhq-treap 0pts求救
368204
ShanQing楼主2023/11/9 22:32

近几天第三次求调了。本人码力弱,喷轻点。

样例已过,交上去是0pts。调了两天,大概率是make_same的问题。可惜本人太蒻找不到。

//writer:Oier_szc

#include <bits/stdc++.h>
//#include <windows.h>
#define TS cerr<<"I AK IOI"<<endl;
#define cr(x) cerr<<x<<endl;
#define cr2(x,y) cerr<<x<<" "<<y<<endl;
#define cr3(x,y,z) cerr<<x<<" "<<y<<" "<<z<<endl;
//#define int long long
using namespace std;
const int N=1e6+5,INF=2e9;
int n,m;
struct node
{
	int l,r;
	int key,val,siz;
	int same,rev;
	int ans,sum,ls,rs;	
}tr[N];
int root=0,idx=0;
int nodes[N],top=0;
int w[N];
int get_node(int key)
{
	node &u=tr[nodes[top--]];
	u.l=u.r=u.rev=0;
	u.same=INF;
	u.val=rand();
	u.siz=1;
	u.key=u.sum=u.ans=key;
	u.ls=u.rs=max(key,0);
	return nodes[top+1];
}
void pushup(node &p)
{
	node &l=tr[p.l],&r=tr[p.r];
	p.siz=l.siz+r.siz+1;
	p.sum=l.sum+r.sum+p.key;
	p.ans=max(max(l.ans,r.ans),l.rs+r.ls+p.key);
	p.ls=max(l.ls,l.sum+r.ls+p.key);
	p.rs=max(r.rs,r.sum+l.rs+p.key);
}
void Same(int p,int c)
{
	if(!p) return;
	tr[p].val=tr[p].same=c;
	tr[p].sum=c*tr[p].siz;
	tr[p].ls=tr[p].rs=max(tr[p].sum,0);
	tr[p].ans=max(tr[p].sum,c);
	tr[p].rev=0;
}
void Rev(int p)
{
	if(!p) return;
	swap(tr[p].ls,tr[p].rs);
	swap(tr[p].l,tr[p].r);
	tr[p].rev^=1;
}
void pushdown(node &p)
{
	if(p.same!=INF)
	{
		TS
		Same(p.l,p.same),Same(p.r,p.same);
		p.same=INF;
	}
	if(p.rev)
	{
		Rev(p.l),Rev(p.r);
		p.rev=0;
	}
}
void split(int p,int key,int &x,int &y)
{
	if(!p) x=y=0;
	else
	{
		pushdown(tr[p]);
		if(tr[tr[p].l].siz+1<=key) x=p,split(tr[p].r,key-tr[tr[p].l].siz-1,tr[p].r,y);
		else y=p,split(tr[p].l,key,x,tr[p].l);
		pushup(tr[p]);
	}
}
int merge(int x,int y)
{
	if(!x||!y) return x|y;
	if(tr[x].val<tr[y].val)
	{
		pushdown(tr[x]);
		tr[x].r=merge(tr[x].r,y),pushup(tr[x]);
		return x;
	}
	else
	{
		pushdown(tr[y]);
		tr[y].l=merge(x,tr[y].l),pushup(tr[y]);
		return y;
	}
}
void dfs(int p)
{
	if(tr[p].l) dfs(tr[p].l);
	if(tr[p].r) dfs(tr[p].r);
	nodes[++top]=p;
}
/*void print1(int p)
{
	if(tr[p].l) print1(tr[p].l);
	printf("%d ",p);
	if(tr[p].r) print1(tr[p].r);
}
void print2(int p)
{
	printf("%d ",p);
	if(tr[p].l) print2(tr[p].l);
	if(tr[p].r) print2(tr[p].r);
}*/
int main()
{
	tr[0].ans=-INF;
	for(int i=N-1;i>=1;--i) nodes[++top]=i;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	{
		scanf("%d",&w[i]);
		root=merge(root,get_node(w[i]));
	}
	char op[12];
	int pos,tot,c;
	int x,y,z;
	while(m--)
	{
		scanf("%s",op);
		if(op[0]=='I')
		{
			scanf("%d%d",&pos,&tot);
			split(root,pos,x,y);
			for(int i=1;i<=tot;++i)
			{
				scanf("%d",&w[i]);
				x=merge(x,get_node(w[i]));
			}
			root=merge(x,y);
		}
		else if(op[0]=='D')
		{
			scanf("%d%d",&pos,&tot);
			split(root,pos+tot-1,x,y);
			split(x,pos-1,x,z);
			dfs(z);
			root=merge(x,y);
		}
		else if(op[2]=='K')
		{
			scanf("%d%d%d",&pos,&tot,&c);
			//continue;
			split(root,pos+tot-1,x,y);
			split(x,pos-1,x,z);
			Same(z,c);
			root=merge(merge(x,z),y);
		}
		else if(op[0]=='R')
		{
			scanf("%d%d",&pos,&tot);
			split(root,pos+tot-1,x,y);
			split(x,pos-1,x,z);
			Rev(z);
			root=merge(merge(x,z),y);
			//TS
		}
		else if(op[0]=='G')
		{
			scanf("%d%d",&pos,&tot);
			split(root,pos+tot-1,x,y);
			split(x,pos-1,x,z);
			printf("%d\n",tr[z].sum);
			root=merge(merge(x,z),y);
		}
		else if(op[2]=='X')
		{
			printf("%d\n",tr[root].ans);
		}
		//printf("%d\n",tr[root].ans);
		/*print1(root);
		printf("\n");
		print2(root);
		printf("\n");*/
	}
	return 0;
}
/*
9 8 
2 -6 3 5 1 -5 -3 6 3 
GET-SUM 5 4
MAX-SUM
INSERT 0 3 -5 7 2
DELETE 12 1
MAKE-SAME 3 3 2
REVERSE 3 6
GET-SUM 5 4
MAX-SUM
*/

2023/11/9 22:32
加载中...