求调
查看原帖
求调
755689
ACtheQ楼主2023/8/22 20:33
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int cnt=0,rt;
struct Node
{
	int ls,rs;
	char val;
	int pri;
	int siz;
}t[N];
int newNode(int x)
{
	t[++cnt].siz=1;
	t[cnt].ls=t[cnt].rs=0;
	t[cnt].val=x;
	t[cnt].pri=rand();
	return cnt;
}
void update(int u)
{
	t[u].siz=t[t[u].ls].siz+t[t[u].rs].siz+1;
}
void Split(int u,int x,int &L,int &R)
{
	if(u==0)
	{
		L=R=0;
		return;
	} 
	if(t[t[u].ls].siz+1<=x)
	{
		L=u;
		Split(t[u].rs,x-t[t[u].ls].siz-1,t[u].rs,R);
	}
	else
	{
		R=u;
		Split(t[u].ls,x,L,t[u].ls);
	}
	update(u);
}
int Merge(int L,int R)
{
	if(L==0||R==0) return L+R;
	if(t[L].pri>t[R].pri)
	{
		t[L].rs=Merge(t[L].rs,R);
		update(L);
		return L;
	}
	else
	{
		t[R].ls=Merge(L,t[R].ls);
		update(R);
		return R;
	}
}
void print(int u)
{
	if(u==0) return;
	print(t[u].ls);
	cout<<t[u].val;
	print(t[u].rs);
}
int main()
{
	srand(time(NULL));
	int n;
	int len;
	int L,R;
	int p,pos=0;
	cin>>n;
	while(n--)
	{
		string op;
		cin>>op;
		if(op[0]=='M') cin>>pos;
		if(op[0]=='I')
		{
			cin>>len;
			Split(rt,pos,L,R);
			for(int i=1;i<=len;i++)
			{
				char c=getchar();
				while(c<32||c>126) c=getchar();
				L=Merge(L,newNode(c));
			}
			rt=Merge(L,R);
		}
		if(op[0]=='D')
		{
			cin>>len;
			Split(rt,pos+len,L,R);
			Split(L,pos,L,p);
			rt=Merge(L,R);
		}
		if(op[0]=='G')
		{
			cin>>len;
			Split(rt,pos+len,L,R);
			Split(L,pos,L,p);
			print(p);cout<<endl;
			rt=Merge(Merge(L,p),R);
		}
		if(op[0]=='R')
		{
			cin>>len;
			int x,y,z;
			Split(rt,1,x,y);
			Split(y,len,y,z);
			rt=Merge(x,z);
		}
		if(op[0]=='P') pos--;
		if(op[0]=='N') pos++; 
	}
	return 0;
}





2023/8/22 20:33
加载中...