【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 }
时间: 2024-08-26 12:17:05

【HDOJ】3487 Play with Chain的相关文章

【HDOJ】4956 Poor Hanamichi

基本数学题一道,看错位数,当成大数减做了,而且还把方向看反了.所求为最接近l的值. 1 #include <cstdio> 2 3 int f(__int64 x) { 4 int i, sum; 5 6 i = sum = 0; 7 while (x) { 8 if (i & 1) 9 sum -= x%10; 10 else 11 sum += x%10; 12 ++i; 13 x/=10; 14 } 15 return sum; 16 } 17 18 int main() { 1

【HDOJ】1099 Lottery

题意超难懂,实则一道概率论的题目.求P(n).P(n) = n*(1+1/2+1/3+1/4+...+1/n).结果如果可以除尽则表示为整数,否则表示为假分数. 1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 25 5 6 __int64 buf[MAXN]; 7 8 __int64 gcd(__int64 a, __int64 b) { 9 if (b == 0) return a; 10 else return

【HDOJ】2844 Coins

完全背包. 1 #include <stdio.h> 2 #include <string.h> 3 4 int a[105], c[105]; 5 int n, m; 6 int dp[100005]; 7 8 int mymax(int a, int b) { 9 return a>b ? a:b; 10 } 11 12 void CompletePack(int c) { 13 int i; 14 15 for (i=c; i<=m; ++i) 16 dp[i]

【HDOJ】3509 Buge&#39;s Fibonacci Number Problem

快速矩阵幂,系数矩阵由多个二项分布组成.第1列是(0,(a+b)^k)第2列是(0,(a+b)^(k-1),0)第3列是(0,(a+b)^(k-2),0,0)以此类推. 1 /* 3509 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #incl

【HDOJ】1818 It&#39;s not a Bug, It&#39;s a Feature!

状态压缩+优先级bfs. 1 /* 1818 */ 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <algorithm> 8 using namespace std; 9 10 #define MAXM 105 11 12 typedef struct {

【HDOJ】2424 Gary&#39;s Calculator

大数乘法加法,直接java A了. 1 import java.util.Scanner; 2 import java.math.BigInteger; 3 4 public class Main { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 int n; 8 int i, j, k, tmp; 9 int top; 10 boolean flag; 11 int t

【HDOJ】2425 Hiking Trip

优先级队列+BFS. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 25 8 9 typedef struct node_st { 10 int x, y, t; 11 node_st() {} 12 node_st(int xx, int yy, int tt)

【HDOJ】1686 Oulipo

kmp算法. 1 #include <cstdio> 2 #include <cstring> 3 4 char src[10005], des[1000005]; 5 int next[10005], total; 6 7 void kmp(char des[], char src[]){ 8 int ld = strlen(des); 9 int ls = strlen(src); 10 int i, j; 11 12 total = i = j = 0; 13 while (

【HDOJ】2795 Billboard

线段树.注意h范围(小于等于n). 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXN 200005 5 #define lson l, mid, rt<<1 6 #define rson mid+1, r, rt<<1|1 7 #define mymax(x, y) (x>y) ? x:y 8 9 int nums[MAXN<<2]; 10 int h, w; 11 12