伸展树模板

一开始跟着数据结构的书自己写了指针版本的,感觉写得太长太不优雅,后来想学别人用数组模拟指针的那种写法。。不过用不来,所以还是用自己写的吧,至少习惯,也没BUG吧。。LCT那边另外了,写不来,只能抄别人模板。。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 typedef struct Node *pNode;
 5 struct Node{
 6     int val,siz; bool rev;
 7     pNode lch,rch,par;
 8     Node(int _val,pNode _par):val(_val),siz(1),rev(0),lch(NULL),rch(NULL),par(_par){}
 9 };
10 pNode root;
11 inline void pushdown(pNode x){
12     if(x->rev){
13         swap(x->lch,x->rch);
14         if(x->lch) x->lch->rev^=1;
15         if(x->rch) x->rch->rev^=1;
16         x->rev=0;
17     }
18 }
19 inline void pushup(pNode x){
20     x->siz=1;
21     if(x->lch) x->siz+=x->lch->siz;
22     if(x->rch) x->siz+=x->rch->siz;
23 }
24 inline void zig(pNode x){
25     pNode y=x->par,z=y->par;
26     pushdown(y); pushdown(x);
27 
28     x->par=z;//
29     if(z) z->lch==y?z->lch=x:z->rch=x;
30     z=x->rch;//
31     if(z) z->par=y;
32     y->lch=z;
33     y->par=x; x->rch=y;//
34 
35     pushup(y);
36 }
37 inline void zag(pNode x){
38     pNode y=x->par,z=y->par;
39     pushdown(y); pushdown(x);
40 
41     x->par=z;//
42     if(z) z->lch==y?z->lch=x:z->rch=x;
43     z=x->lch;//
44     if(z) z->par=y;
45     y->rch=z;
46     y->par=x; x->lch=y;//
47 
48     pushup(y);
49 }
50 inline void splay(pNode x,pNode par){
51     pushdown(x);
52     while(x->par!=par){
53         pNode y=x->par,z=y->par;
54         if(z==par){
55             y->lch==x?zig(x):zag(x);
56         }else{
57             if(z->lch==y){
58                 if(y->lch==x){
59                     zig(y); zig(x);
60                 }else{
61                     zag(x); zig(x);
62                 }
63             }else{
64                 if(y->lch==x){
65                     zig(x); zag(x);
66                 }else{
67                     zag(y); zag(x);
68                 }
69             }
70         }
71     }
72     pushup(x);
73     if(par==NULL) root=x;
74 }
75 inline pNode findkth(int k){
76     ++k;
77     pNode x=root;
78     int lsiz;
79     for(;x;){
80         pushdown(x);
81         lsiz=x->lch?x->lch->siz:0;
82         if(lsiz+1==k){
83             return x;
84         }else if(k<=lsiz){
85             x=x->lch;
86         }else{
87             k-=lsiz+1;
88             x=x->rch;
89         }
90     }
91     return NULL;
92 }
93 int main(){
94     root=NULL;
95     return 0;
96 } 

 

posted @ 2015-10-01 11:24  WABoss  阅读(323)  评论(0编辑  收藏  举报