FHQ_Treap WA&RE 12pts 求调
查看原帖
FHQ_Treap WA&RE 12pts 求调
779970
lunjiahao楼主2024/4/22 11:42

rt,从 P4008 过来的

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int n,pos,root,cnt,L,R,p;
struct FHQ_Treap
{
	int ls,rs;
	char val;
	int pri,siz,tag;
}t[N];
int newNode(char x)
{
	t[++cnt]={0,0,x,rand(),1,0};
	return cnt;
}
void update(int u)
{
	t[u].siz=t[t[u].ls].siz+t[t[u].rs].siz+1;
}
void push_down(int u)
{
	if(!t[u].tag) return;
	swap(t[u].ls,t[u].rs);
	t[t[u].ls].tag^=1;
	t[t[u].rs].tag^=1;
	t[u].tag=0;
}
void spilt(int u,int x,int &L,int &R)
{
	if(!u)
	{
		L=R=0;
		return;
	}
	push_down(u);
	if(t[t[u].ls].siz+1<=x)
	{
		L=u;
		spilt(t[u].rs,x-t[t[u].ls].siz-1,t[u].rs,R);
	}
	else
	{
		R=u;
		spilt(t[u].ls,x,L,t[u].ls);
	}
	update(u);
}
int merge(int L,int R)
{
	if(!L||!R) return L|R;
	if(t[L].pri>t[R].pri)
	{
		push_down(L);
		t[L].rs=merge(t[L].rs,R);
		update(L);
		return L;
	}
	else
	{
		push_down(R);
		t[R].ls=merge(L,t[R].ls);
		update(R);
		return R;
	}
}
int main()
{
	srand(time(0));
	scanf("%d",&n);
	while(n--)
	{
		int len;
		char opt[15];
		scanf("%s",&opt);
		char ch=getchar();
		if(opt[0]=='M') scanf("%d",&pos);
		if(opt[0]=='I')
		{
			scanf("%d",&len);
			spilt(root,pos,L,R);
			for(int i=1;i<=len;i++)
			{
				char ch=getchar();
				while(ch<32||ch>126) ch=getchar();
				L=merge(L,newNode(ch));
			}
			root=merge(L,R);
		}
		if(opt[0]=='D')
		{
			scanf("%d",&len);
			spilt(root,pos+len,L,R);
			spilt(L,pos,L,p);
			root=merge(L,R);
		}
		if(opt[0]=='R')
		{
			scanf("%d",&len);
			spilt(root,pos+len,L,R);
			spilt(L,pos,L,p);
			t[p].tag^=1;
			root=merge(merge(L,p),R);
		}
		if(opt[0]=='G')
		{
			spilt(root,pos+1,L,R);
			spilt(L,pos,L,p);
			printf("%c",t[p].val);
			if(t[p].val!='\n') printf("\n");
			root=merge(merge(L,p),R);
		}
		if(opt[0]=='P') pos--;
		if(opt[0]=='N') pos++;
	}
	return 0;
}
2024/4/22 11:42
加载中...