蒟蒻求助,用了Splay

P2596 [ZJOI2006] 书架

```cpp #include<bits/stdc++.h> #define maxn 1000001 #define L(node) (tree[node].ch[0]) #define R(node) (tree[node].ch[1]) #define F(node) (tree[node].fa) using namespace std; struct kkk{ int ch[2],val,size,fa; kkk(){ch[0]=ch[1]=val=size=fa=0;} }tree[maxn]; int n,m,x,y,top,cnt,root,answ; int pos[maxn]; char MODE[11]; void pushup(int node){ tree[node].size=tree[L(node)].size+tree[R(node)].size+1; pos[tree[L(node)].val]=L(node); pos[tree[R(node)].val]=R(node); } void rotate(int node){ int fa=F(node); int gfa=F(fa); int z=tree[fa].ch[1]==node; tree[gfa].ch[tree[gfa].ch[1]==fa]=node; tree[node].fa=gfa; tree[fa].ch[z]=tree[node].ch[z^1]; tree[tree[node].ch[z^1]].fa=fa; tree[node].ch[z^1]=fa; tree[fa].fa=node; pushup(fa); pushup(node); } void Splay(int node,int goal){ while(tree[node].fa!=goal){ int fa=F(node); int gfa=F(fa); if(gfa!=goal) ((tree[gfa].ch[1]==fa)==(tree[fa].ch[1]==node))?rotate(fa):rotate(node); rotate(node); } pos[tree[node].val]=node; if(!goal)root=node; } int kth(int x){ int node=root; while(1){ if(tree[L(node)].size>=x)node=L(node); else{ x-=tree[L(node)].size; if(x==1) return tree[node].val; x--;node=R(node); } } } void Top_Bottom(int x,int mode){ Splay(pos[x],0); if(!tree[root].ch[mode])return ; if(!tree[root].ch[!mode]) tree[root].ch[!mode]=tree[root].ch[mode],tree[root].ch[mode]=0; else{ int node=tree[root].ch[!mode];while(tree[node].ch[mode])node=tree[node].ch[mode]; tree[tree[root].ch[mode]].fa=node; tree[node].ch[mode]=tree[root].ch[mode]; tree[root].ch[mode]=0; Splay(tree[node].ch[mode],0); } } void Ins(int x,int mode){ Splay(pos[x],0); if(!mode)return ; if(mode==1){ int node=R(root); while(L(node))node=L(node); swap(pos[x],pos[tree[node].val]); swap(tree[pos[x]].val,tree[node].val); }else{ int node=L(root); while(R(node))node=R(node); swap(pos[x],pos[tree[node].val]); swap(tree[pos[x]].val,tree[node].val); } } void ask(int x){ Splay(pos[x],0);answ++; printf("%d\n",tree[L(root)].size); } void query(int x){answ++; printf("%d\n",kth(x)); } void New(int node,int val,int fa){ tree[node].val=val;tree[node].fa=fa; tree[node].ch[0]=tree[node].ch[1]=0; tree[node].size=1;pos[val]=node; } void insert(int x){ int node=root; while(R(root))node=R(root); cnt++; tree[cnt].fa=node; tree[node].ch[1]=cnt; tree[cnt].val=x;pos[x]=cnt; tree[cnt].size=1; tree[cnt].ch[0]=tree[cnt].ch[1]=0; Splay(cnt,0); } void print(int node){ if(L(node))print(L(node)); printf("%d\n",tree[node].val); if(R(node))print(R(node)); } int main(){ scanf("%d%d",&n,&m);cnt=0; for(int i=1;i<=n;i++){ scanf("%d",&x);/*cnt++; New(cnt,x,cnt-1); tree[cnt-1].ch[1]=cnt; Splay(cnt,0);*/ insert(x); } //print(root); for(int i=1;i<=m;i++){ scanf("%s",MODE); scanf("%d",&x); if(MODE[0]=='T')Top_Bottom(x,0); if(MODE[0]=='B')Top_Bottom(x,1); if(MODE[0]=='I')scanf("%d",&y),Ins(x,y); if(MODE[0]=='A')ask(x); if(MODE[0]=='Q')query(x); } return 0; } ```
by hyfhaha @ 2019-04-25 22:24:56


你都看题解了,为啥不对着题解改完呢?(雾
by Luvwgyx @ 2019-04-26 08:18:33


@[Luvwgyx](/space/show?uid=43012) 就是找不到错啊QAQ
by hyfhaha @ 2019-04-26 19:04:45


|