【BZOJ1507】[NOI2003]Editor Splay

来源:互联网 发布:自学unity3d要多久 编辑:程序博客网 时间:2024/06/05 16:10

仍然是Splay模板题,水水化版 1500 ,水化版 1269 。让我们写一下输出操作(简简单单),然后尽情地往下删除该死的第四个操作的恶心代码!!!(原谅我这样讨厌的做题顺序)

终于,Splay失去了它所有的标记和 pushdown 操作……

此题唯一需要注意的是:“ DELETE操作、ROTATE操作和GET操作执行时光标后必然有足够的字符。MOVE、PREV、NEXT操作不会把光标移动到非法位置。 输入文件没有错误。”这句话是用来给我们呵呵的!!!如果信的话,恭喜你连样例都过不了!!!同时这也是1269进步的一点……

[NOI2003]Editor C++代码实现:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define N 2100000int n;char a[N],b[10];struct node{<span style="white-space:pre"></span>node *ch[2],*fa;<span style="white-space:pre"></span>char v;int s;<span style="white-space:pre"></span>inline void maintain()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>s=ch[0]->s+ch[1]->s+1;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>inline bool check()<span style="white-space:pre"></span>{<span style="white-space:pre"></span>return fa->ch[1]==this;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>inline void combine(node *a,int d)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>ch[d]=a;<span style="white-space:pre"></span>a->fa=this;<span style="white-space:pre"></span>}};node *null=new node();node *root=null;inline node *newnode(node *f,char val){<span style="white-space:pre"></span>node *re=new node();<span style="white-space:pre"></span>re->s=1;<span style="white-space:pre"></span>re->v=val;<span style="white-space:pre"></span>re->ch[0]=re->ch[1]=null;<span style="white-space:pre"></span>re->fa=f;<span style="white-space:pre"></span>return re;}inline void rotate(node *x,int d){<span style="white-space:pre"></span>node *k=x->fa;<span style="white-space:pre"></span>k->ch[d^1]=x->ch[d];<span style="white-space:pre"></span>k->ch[d^1]->fa=k;<span style="white-space:pre"></span>x->ch[d]=k;<span style="white-space:pre"></span>x->fa=k->fa;<span style="white-space:pre"></span>k->fa->ch[k->fa->ch[0]==k?0:1]=x;<span style="white-space:pre"></span>k->fa=x;<span style="white-space:pre"></span>k->maintain();<span style="white-space:pre"></span>x->maintain();<span style="white-space:pre"></span>if(root==k) root=x;}inline void splay(node *x,node *aim){<span style="white-space:pre"></span>while(x->fa!=aim)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>if(x->fa->fa==aim)<span style="white-space:pre"></span>rotate(x,x->check()?0:1);<span style="white-space:pre"></span>else if(!x->fa->check())<span style="white-space:pre"></span>x->check()?rotate(x,0):rotate(x->fa,1),<span style="white-space:pre"></span>rotate(x,1);<span style="white-space:pre"></span>else<span style="white-space:pre"></span>x->check()?rotate(x->fa,0):rotate(x,1),<span style="white-space:pre"></span>rotate(x,0);<span style="white-space:pre"></span>x->maintain();<span style="white-space:pre"></span>}}node *build(int l,int r){<span style="white-space:pre"></span>if(l>r) return null;<span style="white-space:pre"></span>int mid=(l+r)>>1;<span style="white-space:pre"></span>node *re=newnode(re,a[mid]);<span style="white-space:pre"></span>re->combine(build(l,mid-1),0);<span style="white-space:pre"></span>re->combine(build(mid+1,r),1);<span style="white-space:pre"></span>re->maintain();<span style="white-space:pre"></span>return re;}void del(node* &x){<span style="white-space:pre"></span>if(x->ch[0]!=null)<span style="white-space:pre"></span>del(x->ch[0]);<span style="white-space:pre"></span>if(x->ch[1]!=null)<span style="white-space:pre"></span>del(x->ch[1]);<span style="white-space:pre"></span>delete x;}node *kth(node *x,int k){<span style="white-space:pre"></span>if(k<=x->ch[0]->s)<span style="white-space:pre"></span>return kth(x->ch[0],k);<span style="white-space:pre"></span>k-=x->ch[0]->s;<span style="white-space:pre"></span>if(k==1) return x;<span style="white-space:pre"></span>return kth(x->ch[1],k-1);}void print(node *x){<span style="white-space:pre"></span>if(x==null) return;<span style="white-space:pre"></span>print(x->ch[0]);<span style="white-space:pre"></span>putchar(x->v);<span style="white-space:pre"></span>print(x->ch[1]);}int main(){<span style="white-space:pre"></span>cin>>n;<span style="white-space:pre"></span>root=build(0,1);<span style="white-space:pre"></span>root->fa=null;<span style="white-space:pre"></span>for(int x,t=0,i=1;i<=n;i++)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>scanf("%s",b);<span style="white-space:pre"></span>if(b[0]=='M')<span style="white-space:pre"></span>scanf("%d",&t);<span style="white-space:pre"></span>else if(b[0]=='I')<span style="white-space:pre"></span>{<span style="white-space:pre"></span>scanf("%d",&x);<span style="white-space:pre"></span>for(int i=0;i<x;i++)<span style="white-space:pre"></span>while((a[i]=getchar())=='\n'||a[i]=='\r');<span style="white-space:pre"></span>splay(kth(root,t+1),null);<span style="white-space:pre"></span>splay(kth(root,t+2),root);<span style="white-space:pre"></span>root->ch[1]->combine(build(0,x-1),0);<span style="white-space:pre"></span>root->ch[1]->maintain();<span style="white-space:pre"></span>root->maintain();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>else if(b[0]=='D')<span style="white-space:pre"></span>{<span style="white-space:pre"></span>scanf("%d",&x);<span style="white-space:pre"></span>splay(kth(root,t+1),null);<span style="white-space:pre"></span>splay(kth(root,min(t+x+2,root->s)),root);<span style="white-space:pre"></span>del(root->ch[1]->ch[0]);<span style="white-space:pre"></span>root->ch[1]->ch[0]=null;<span style="white-space:pre"></span>root->ch[1]->maintain();<span style="white-space:pre"></span>root->maintain();<span style="white-space:pre"></span>}<span style="white-space:pre"></span>else if(b[0]=='G')<span style="white-space:pre"></span>{<span style="white-space:pre"></span>scanf("%d",&x);<span style="white-space:pre"></span>splay(kth(root,t+1),null);<span style="white-space:pre"></span>splay(kth(root,t+x+2),root);<span style="white-space:pre"></span>print(root->ch[1]->ch[0]);<span style="white-space:pre"></span>putchar('\n');<span style="white-space:pre"></span>}<span style="white-space:pre"></span>else if(b[0]=='P') t--;<span style="white-space:pre"></span>else t++;<span style="white-space:pre"></span>}}

0 0
原创粉丝点击