BZOJ 1269 【AHOI2006】 文本编辑器
题目链接:文本编辑器
这道题没啥好说的,直接上\(Splay\)就行了,板子题……
但是我某个地方忘了下放标记导致调了一晚上
听说有个东西叫\(rope\)可以直接过?然而我并不会
保存一发板子:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) #define maxn 1024*1024*2+10 using namespace std; typedef long long llg; int m,rt,tt,now,n; int s[maxn][2],fa[maxn],siz[maxn]; char ss[maxn],val[maxn]; bool rev[maxn]; int getint(){ int w=0;bool q=0; char c=getchar(); while((c>'9'||c<'0')&&c!='-') c=getchar(); if(c=='-') c=getchar(),q=1; while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w; } void update(int x){siz[x]=siz[s[x][0]]+siz[s[x][1]]+1;} void rotate(int x,int &k){ int p=fa[x],g=fa[p]; bool l=(x==s[p][1]),r=!l; if(p==k) k=x; else s[g][p==s[g][1]]=x; fa[s[x][r]]=p; s[p][l]=s[x][r]; s[x][r]=p; fa[p]=x; fa[x]=g; update(p),update(x); } void splay(int x,int &k){ while(x!=k){ int p=fa[x],g=fa[p]; if(p!=k){ if((x==s[p][1])^(p==s[g][1])) rotate(x,k); else rotate(p,k); } rotate(x,k); } } int find(int x){ int u=rt,l,r; x++; while(u){ l=s[u][0],r=s[u][1]; if(rev[u]){ rev[l]^=1,rev[r]^=1; rev[u]=0; swap(l,r),swap(s[u][0],s[u][1]); } if(siz[l]+1==x) break; if(siz[l]>=x) u=l; else x-=siz[l]+1,u=r; } return u; } int split(int l,int r){ splay(find(l-1),rt); splay(find(r+1),s[rt][1]); return s[s[rt][1]][0]; } int build(int l,int r){ if(l>r) return 0; int u=++tt,mid=(l+r)>>1; s[u][0]=build(l,mid-1),s[u][1]=build(mid+1,r); fa[s[u][0]]=u,fa[s[u][1]]=u,val[u]=ss[mid]; update(u); return u; } int main(){ File("a"); m=getint(); rt=1; tt=5; s[1][0]=2; s[1][1]=3; s[3][0]=4; s[3][1]=5; fa[4]=fa[5]=3; fa[2]=fa[3]=1; for(int i=5;i;i--) update(i),val[i]=' '; while(m--){ scanf("%s",ss); int u,v; if(ss[0]=='M') now=getint(); else if(ss[0]=='P') now--; else if(ss[0]=='N') now++; else if(ss[0]=='G') printf("%c\n",val[find(now+1)]); else if(ss[0]=='I'){ n=getint(); for(int i=1;i<=n;i++) ss[i]=getchar(); v=build(1,n); split(now+1,now); u=s[rt][1]; s[u][0]=v; fa[v]=u; while(u) update(u),u=fa[u]; } else{ n=getint(); u=split(now+1,now+n); if(ss[0]=='R') rev[u]^=1; else{ s[fa[u]][0]=0; fa[u]=0; update(s[rt][1]); update(rt); } } } return 0; }