uva 11922 Permutation Transforme/splay tree

原题链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18902

伸展树的区间翻转剪切。。。

如下:

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<iostream>
  4 #include<algorithm>
  5 const int Max_N = 100010;
  6 struct Node{
  7     int v, s, rev;
  8     Node *pre, *ch[2];
  9     inline void set(int _v = -1, int _s = 0, Node *p = NULL){
 10         v = _v, s = _s, rev = 0;
 11         pre = ch[0] = ch[1] = p;
 12     }
 13     inline void push_up(){
 14         s = ch[0]->s + ch[1]->s + 1;
 15     }
 16     inline void update(){
 17         rev ^= 1;
 18         std::swap(ch[0], ch[1]);
 19     }
 20     inline void push_down(){
 21         if (rev != 0){
 22             rev ^= 1;
 23             ch[0]->update();
 24             ch[1]->update();
 25         }
 26     }
 27 };
 28 struct SplayTree{
 29     int N = 0;
 30     Node *tail, *root, *null, stack[Max_N];
 31     void init(int n){
 32         N = n, tail = &stack[0];
 33         null = tail++;
 34         null->set();
 35         root = newNode(-1);
 36         root->ch[1] = newNode(-1);
 37         root->ch[1]->pre = root;
 38         Node *x = built(1, n);
 39         root->ch[1]->ch[0] = x;
 40         x->pre = root->ch[1];
 41         root->ch[1]->push_up();
 42         root->push_up();
 43     }
 44     inline Node *newNode(int v){
 45         Node *p = tail++;
 46         p->set(v, 1, null);
 47         return p;
 48     }
 49     Node *built(int l, int r){
 50         if (l > r) return null;
 51         int mid = (l + r) >> 1;
 52         Node *p = newNode(mid);
 53         p->ch[0] = built(l, mid - 1);
 54         if (p->ch[0] != null) p->ch[0]->pre = p;
 55         p->ch[1] = built(mid + 1, r);
 56         if (p->ch[1] != null) p->ch[1]->pre = p;
 57         p->push_up();
 58         return p;
 59     }
 60     inline void rotate(Node *x, int c){
 61         Node *y = x->pre;
 62         y->push_down(), x->push_down();
 63         y->ch[!c] = x->ch[c];
 64         x->pre = y->pre;
 65         if (x->ch[c] != null) x->ch[c]->pre = y;
 66         if (y->pre != null) y->pre->ch[y->pre->ch[0] != y] = x;
 67         x->ch[c] = y;
 68         y->pre = x;
 69         y->push_up();
 70         if (y == root) root = x;
 71     }
 72     inline void splay(Node *x, Node *f){
 73         if (x == root) return;
 74         for (; x->pre != f; x->push_down()){
 75             if (x->pre->pre == f){
 76                 rotate(x, x->pre->ch[0] == x);
 77             } else {
 78                 Node *y = x->pre, *z = y->pre;
 79                 if (z->ch[0] == y){
 80                     if (y->ch[0] == x) 
 81                         rotate(y, 1), rotate(x, 1);
 82                     else rotate(x, 0), rotate(x, 1);
 83                 } else {
 84                     if (y->ch[1] == x) 
 85                         rotate(y, 0), rotate(x, 0);
 86                     else rotate(x, 1), rotate(x, 0);
 87                 }
 88             }
 89         }
 90         x->push_up();
 91     }
 92     inline Node *select(Node *x, int k){
 93         for (int t = 0; x != null;){
 94             x->push_down();
 95             t = x->ch[0]->s;
 96             if (t == k) break;
 97             else if (k < t) x = x->ch[0];
 98             else k -= t + 1, x = x->ch[1];
 99         }
100         return x;
101     }
102     inline Node *get_range(int l, int r){
103         splay(select(root, l - 1), null);
104         splay(select(root, r + 1), root);
105         return root->ch[1]->ch[0];
106     }
107     inline Node *reverse(int l, int r){
108         Node *x = get_range(l, r);
109         x->update();
110         return x;
111     }
112     inline void cut_link(int l, int r){
113         Node *x = reverse(l, r);
114         root->ch[1]->ch[0] = null;
115         root->ch[1]->push_up();
116         root->push_up();
117         int  k = N - r + l - 1;
118         get_range(1, k);
119         splay(select(root, k), null);
120         splay(select(root, k + 1), root);
121         root->ch[1]->ch[0] = x;
122         x->pre = root->ch[1];
123         root->ch[1]->push_up();
124         root->push_up();
125     }
126     inline void travle(Node *x){
127         if (x != null){
128             x->push_down();
129             travle(x->ch[0]);
130             printf("%d
", x->v);
131             travle(x->ch[1]);
132         }
133     }
134     inline void travle(){
135         get_range(1, N);
136         Node *x = root->ch[1]->ch[0];
137         travle(x);
138     }
139 }Splay;
140 int main(){
141 #ifdef LOCAL
142     freopen("in.txt", "r", stdin);
143     freopen("out.txt", "w+", stdout);
144 #endif
145     int a, b, n, m;
146     while (~scanf("%d %d", &n, &m)){
147         Splay.init(n);
148         while (m--){
149             scanf("%d %d", &a, &b);
150             Splay.cut_link(a, b);
151         }
152         Splay.travle();
153     }
154     return 0;
155 }
View Code
By: GadyPu 博客地址:http://www.cnblogs.com/GadyPu/ 转载请说明
原文地址:https://www.cnblogs.com/GadyPu/p/4455903.html