【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\n", 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\n", 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.\n", (int)clock()); 231 #endif 232 233 return 0; 234 }