【HDOJ】3487 Play with Chain

Splay入门题目,区间翻转,区间分割。

  1 /*  */
  2 #include <iostream>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <set>
  7 #include <stack>
  8 #include <vector>
  9 #include <deque>
 10 #include <algorithm>
 11 #include <cstdio>
 12 #include <cmath>
 13 #include <ctime>
 14 #include <cstring>
 15 #include <climits>
 16 #include <cctype>
 17 #include <cassert>
 18 #include <functional>
 19 #include <iterator>
 20 #include <iomanip>
 21 using namespace std;
 22 //#pragma comment(linker,"/STACK:102400000,1024000")
 23 
 24 #define sti                set<int>
 25 #define stpii            set<pair<int, int> >
 26 #define mpii            map<int,int>
 27 #define vi                vector<int>
 28 #define pii                pair<int,int>
 29 #define vpii            vector<pair<int,int> >
 30 #define rep(i, a, n)     for (int i=a;i<n;++i)
 31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 32 #define clr                clear
 33 #define pb                 push_back
 34 #define mp                 make_pair
 35 #define fir                first
 36 #define sec                second
 37 #define all(x)             (x).begin(),(x).end()
 38 #define SZ(x)             ((int)(x).size())
 39 #define lson            l, mid, rt<<1
 40 #define rson            mid+1, r, rt<<1|1
 41 #define grandlson        ch[ch[root][1]][0]
 42 
 43 const int maxn = 3e5+5;
 44 int pre[maxn], ch[maxn][2], root, tot;
 45 int key[maxn], s[maxn], rev[maxn];
 46 int stk[maxn], top;
 47 int n, m, cnt;
 48 
 49 void newNode(int& r, int fa, int k) {
 50     if (top)
 51         r = stk[top--];
 52     else
 53         r = ++tot;
 54     key[r] = k;
 55     pre[r] = fa;
 56     rev[r] = 0;
 57     ch[r][0] = ch[r][1] = 0;
 58     s[r] = 1;
 59 }
 60 
 61 void PushUp(int r) {
 62     s[r] = s[ch[r][0]] + s[ch[r][1]] + 1;
 63 }
 64 
 65 void UpdateRev(int rt) {
 66     if (rt == 0)    return ;
 67     swap(ch[rt][0], ch[rt][1]);
 68     rev[rt] ^= 1;
 69 }
 70 
 71 void PushDown(int rt) {
 72     if (rev[rt]) {
 73         UpdateRev(ch[rt][0]);
 74         UpdateRev(ch[rt][1]);
 75         rev[rt] = 0;
 76     }
 77 }
 78 
 79 void Build(int& rt, int l, int r, int fa) {
 80     if (l > r)    return ;
 81     
 82     int mid = (l + r) >> 1;
 83     
 84     newNode(rt, fa, mid);
 85     Build(ch[rt][0], l, mid-1, rt);
 86     Build(ch[rt][1], mid+1, r, rt);
 87     PushUp(rt);
 88 }
 89 
 90 void inorder(int rt) {
 91     if (rt == 0)    return ;
 92     inorder(ch[rt][0]);
 93     printf("s = %d, key = %d
", s[rt], key[rt]);
 94     inorder(ch[rt][1]);
 95 }
 96 
 97 void init() {
 98     root = tot = top = 0;
 99     ch[0][0] = ch[0][1] = s[0] = key[0] = pre[0] = rev[0] = 0;
100     newNode(root, 0, -1);
101     newNode(ch[root][1], root, -1);
102     Build(grandlson, 1, n, ch[root][1]);
103     PushUp(ch[root][1]);
104     PushUp(root);
105     #ifndef ONLINE_JUDGE
106         inorder(root);
107     #endif
108 }
109 
110 void Rotate(int x, int d) {
111     int y = pre[x];
112     
113     PushDown(y);
114     PushDown(x);
115     ch[y][d^1] = ch[x][d];
116     pre[ch[x][d]] = y;
117     if (pre[y])
118         ch[pre[y]][ch[pre[y]][1]==y] = x;
119     pre[x] = pre[y];
120     pre[y] = x;
121     ch[x][d] = y;
122     PushUp(y);
123 }
124 
125 void Splay(int r, int goal) {
126     PushDown(r);
127     while (pre[r] != goal) {
128         if (pre[pre[r]] == goal) {
129             PushDown(pre[r]);
130             PushDown(r);
131             Rotate(r, ch[pre[r]][0]==r);
132         } else {
133             PushDown(pre[pre[r]]);
134             PushDown(pre[r]);
135             PushDown(r);
136             int y = pre[r];
137             int d = ch[pre[y]][0]==y;
138             if (ch[y][d] == r) {
139                 Rotate(r, d^1);
140                 Rotate(r, d);
141             } else {
142                 Rotate(y, d);
143                 Rotate(r, d);
144             }
145         }
146     }
147     PushUp(r);
148     if (goal == 0)
149         root = r;
150 }
151 
152 int kth(int r, int k) {
153     PushDown(r);
154     int t = s[ch[r][0]] + 1;
155     
156     if (t == k)
157         return r;
158     else if (k < t)
159         return kth(ch[r][0], k);
160     else
161         return kth(ch[r][1], k-t);
162 }
163 
164 void cut(int l, int r, int c) {
165     Splay(kth(root, l), 0);
166     Splay(kth(root, r+2), root);
167     int tmp = grandlson;
168     grandlson = 0;
169     PushUp(ch[root][1]);
170     PushUp(root);
171     Splay(kth(root, c+1), 0);
172     Splay(kth(root, c+2), root);
173     grandlson = tmp;
174     pre[tmp] = ch[root][1];
175     PushUp(ch[root][1]);
176     PushUp(root);
177 }
178 
179 void flip(int l, int r) {
180     Splay(kth(root, l), 0);
181     Splay(kth(root, r+2), root);
182     UpdateRev(grandlson);
183     PushUp(ch[root][1]);
184     PushUp(root);
185 }
186 
187 void print(int rt) {
188     if (!rt)    return ;
189     
190     PushDown(rt);
191     print(ch[rt][0]);
192     if (cnt>=1 && cnt<=n) {
193         if (cnt < n)
194             printf("%d ", key[rt]);
195         else
196             printf("%d
", key[rt]);
197     }
198     ++cnt;
199     print(ch[rt][1]);
200 }
201 
202 int main() {
203     ios::sync_with_stdio(false);
204     #ifndef ONLINE_JUDGE
205         freopen("data.in", "r", stdin);
206         freopen("data.out", "w", stdout);
207     #endif
208     
209     char cmd[7];
210     int a, b, c;
211     
212     while (scanf("%d %d", &n, &m) != EOF) {
213         if (n<0 && m<0)
214             break;
215         init();
216         while (m--) {
217             scanf("%s %d %d", cmd, &a, &b);
218             if (cmd[0] == 'C') {
219                 scanf("%d", &c);
220                 cut(a, b, c);
221             } else {
222                 flip(a, b);
223             }
224         }
225         cnt = 0;
226         print(root);
227     }
228     
229     #ifndef ONLINE_JUDGE
230         printf("time = %d.
", (int)clock());
231     #endif
232     
233     return 0;
234 }
原文地址:https://www.cnblogs.com/bombe1013/p/4903217.html