模板汇总——splay

 

 

  1 #define lch(x) tr[x].son[0]
  2 #define rch(x) tr[x].son[1]
  3 const int N = 1e5 + 100;
  4 int tot = 0, root;
  5 struct Node{
  6     int son[2], pre, sz;
  7     void init(){ 
  8         sz = 1;
  9         son[0] = son[1] = pre = 0;
 10     }
 11 }tr[N];
 12 
 13 void Push_Rev(int x){
 14     if(!x) return ;
 15     swap(lch(x), rch(x));
 16     tr[x].rev ^= 1;
 17 }
 18 void Push_up(int x){
 19     if(!x) return;
 20     tr[x].sz = tr[lch(x)].sz + tr[rch(x)].sz + 1;
 21 }
 22 
 23 void Push_Down(int x){
 24    if(tr[x].rev){
 25         tr[x].rev = 0;
 26         Push_Rev(lch(x));
 27         Push_Rev(rch(x));
 28     }
 29 }
 30 
 31 void Reverse(int l, int r){
 32     int pl = Find(l, root);
 33     int pr = Find(r+2, root);
 34     Splay(pl, 0);
 35     Splay(pr, pl);
 36     Push_Rev(tr[pr].son[0]);
 37     Push_Up(tr[pr].son[0]);
 38     Push_Up(pr);
 39     Push_Up(pl);
 40 }
 41 
 42 int build(int ll, int rr){
 43     int p = 0, x;
 44     for(int i = rr; i >= ll; i--){
 45         x = ++tot;
 46         tr[x].init();
 47         tr[x].son[1] = p;
 48         tr[p].pre = x;
 49         Push_Up(x);
 50         p = x;
 51     }
 52     return x;
 53 }
 54 
 55 void rotate(int x){
 56     int y = tr[x].pre;
 57     int z = tr[y].pre;
 58     int k = x == rch(y);
 59     tr[x].pre = z;
 60     tr[z].son[y == rch(z)] = x;
 61     tr[y].son[k] = tr[x].son[k^1];
 62     tr[tr[y].son[k]].pre = y;
 63     tr[x].son[k^1] = y;
 64     tr[y].pre = x;
 65     Push_up(y);
 66 }
 67 
 68 void splay(int x, int goal){
 69     while(tr[x].pre != goal){
 70         int y = tr[x].pre;
 71         int z = tr[y].pre;
 72         if(z != goal){
 73             if((lch(y) == x) ^ (lch(z) == y))   rotate(x); ///x和y分别是y和z的同一段的儿子
 74             else rotate(y);
 75         }
 76         rotate(x);
 77     }
 78     if(!goal) root = x;
 79     Push_up(x);
 80 }
 81 int Find(int num, int x){
 82     Push_Down(x);
 83     if(num == tr[lch(x)].sz + 1) return x;
 84     if(num <= tr[lch(x)].sz) return Find(num, lch(x));
 85     return Find(num - tr[lch(x)].sz - 1, rch(x));
 86 }
 87 void Insert_point(LL v, LL z){
 88     int p  = root, ff = 0;
 89     while(p && tr[p].val != v){
 90         ff = p;
 91         p = tr[p].son[ tr[p].val < v];
 92     }
 93     if(p){
 94        tr[p].szz += z;
 95     }
 96     else {
 97         p = ++tot;
 98         if(ff) tr[ff].son[ tr[ff].val < v] = p;
 99         tr[p].init(v, z);
100         tr[p].pre = ff;
101     }
102     splay(p, 0);
103 }
104 
105 void Collect(int x){
106     if(tr[x].son[0]) Clear(tr[x].son[0]);
107     if(tr[x].son[1]) Clear(tr[x].son[1]);
108     sta[++top] = x;
109 }
110 void Delete_tree(int l, int r){
111     int pl = Find(l, root);
112     int pr = Find(r+2, root);
113     Splay(pl, 0);
114     Splay(pr, pl);
115     Collect(tr[pr].son[0]);
116     tr[pr].son[0] = 0;
117     Push_Up(pr);
118     Push_Up(pl);
119 }
120 
121 void dfs(int x){
122     Push_down(x);
123     if(lch(x)) dfs(lch(x));
124     printf("%d ", tr[x].val);
125     if(rch(x)) dfs(rch(x));
126 }
View Code

 

posted @ 2018-08-23 16:45  Schenker  阅读(174)  评论(0编辑  收藏  举报