【模板】文艺平衡树

如题,是一个模板。。。

Splay:

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <cstdio>
  5 #include <cctype>
  6 
  7 inline void read(int & x)
  8 {
  9     x = 0;
 10     int k = 1;
 11     char c = getchar();
 12     while (!isdigit(c))
 13         if (c == '-') c = getchar(), k = -1;
 14         else c = getchar();
 15     while (isdigit(c))
 16         x = (x << 1) + (x << 3) + (c ^ 48),
 17         c = getchar();
 18     x *= k;
 19 }
 20 
 21 const int MAXN = 101015;
 22 int n, m, x, y;
 23 
 24 int a[101010];
 25 
 26 struct SplayHello
 27 {
 28     int rt = 0, tot = 0;
 29     int cnt[MAXN];
 30     int siz[MAXN];
 31     int tag[MAXN];
 32     int val[MAXN]; 
 33     int faz[MAXN];
 34     int son[MAXN][2];
 35     
 36     int Getson(int u)
 37     {
 38         return son[faz[u]][1] == u;
 39     }
 40     
 41     void Update(int u)
 42     {
 43         siz[u] = siz[son[u][0]] + siz[son[u][1]] + cnt[u];
 44     }
 45     
 46     void Pushdown(int u)  //ok
 47     {
 48         if (!tag[u] || !u) return;
 49         if (son[u][0]) tag[son[u][0]] ^= 1;
 50         if (son[u][1]) tag[son[u][1]] ^= 1;
 51         son[u][0] ^= son[u][1],
 52         son[u][1] ^= son[u][0],
 53         son[u][0] ^= son[u][1];
 54         tag[u] = 0;
 55     }
 56     
 57     int Build(int dad, int l, int r)  //ok
 58     {
 59         if (l > r) return 0;
 60         int mid = (l + r) >> 1;
 61         int now = ++tot;
 62         tag[now] = 0;
 63         faz[now] = dad;
 64         val[now] = a[mid];
 65         cnt[now] = siz[now] = 1;
 66         son[now][0] = Build(now, l, mid - 1);
 67         son[now][1] = Build(now, mid + 1, r);
 68         //²»ÄÜÓÃtotµ±¸¸Ç×£¬»á¸Ä±ä 
 69         Update(now);
 70         return now;
 71     }
 72     
 73     void Rotate(int u)   //ok
 74     {
 75         int y = faz[u], z = faz[y], ch = Getson(u);
 76         Pushdown(y), Pushdown(u);
 77         int b = son[u][ch ^ 1];
 78         int d = Getson(y);
 79         son[u][ch ^ 1] = y, son[y][ch] = b;
 80         faz[y] = u, faz[b] = y, faz[u] = z;
 81         if (z) son[z][d] = u;
 82         Update(y), Update(u);
 83     }
 84     
 85     void Splay(int u, int tar)  //ok
 86     {
 87         while (faz[u] != tar)
 88         {
 89             if (faz[faz[u]] != tar)
 90                 if (Getson(u) == Getson(faz[u])) Rotate(faz[u]);
 91                 else Rotate(u);
 92             Rotate(u);
 93         }
 94         if (!tar) rt = u;
 95     }
 96     
 97     int GetKth(int k)
 98     {
 99         int now = rt;
100         while (true)
101         {
102             Pushdown(now);
103             if (siz[son[now][0]] >= k) now = son[now][0];
104             else if (siz[son[now][0]] + cnt[now] >= k) return now;
105             else k -= siz[son[now][0]] + cnt[now], now = son[now][1];
106         }
107     }
108     
109     void Rever(int l, int r)
110     {
111         int L = GetKth(l - 1);
112         int R = GetKth(r + 2);
113         Splay(L, 0); Splay(R, L);
114         tag[son[son[rt][1]][0]] ^= 1;
115         Update(L), Update(R), Update(son[R][0]);
116     }
117     
118     void print(int u)
119     {
120         Pushdown(u);
121         if (son[u][0]) print(son[u][0]);
122         if (val[u] != -2147483600 && val[u] != 2147483600) 
123             printf("%d ", val[u]);
124         if (son[u][1]) print(son[u][1]);
125     }
126     
127     void BuildT(int l, int r)
128     {
129         rt = Build(0, l, r);
130     }
131     
132     void printT()
133     {
134         print(rt);
135     }
136 }splay;
137 
138 signed main()
139 {
140     read(n), read(m);
141     for (int i = 1; i <= n; ++i) a[i] = i;
142     a[n + 1] = 2147483600;
143     a[0] = -2147483600;
144     splay.BuildT(0, n + 1);
145     for (int i = 1; i <= m; ++i)
146     {
147         read(x), read(y);
148         splay.Rever(x, y);
149     }
150     splay.printT();
151     return 0;
152 }

 

FHQ::

 

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <cstdio>
  5 #include <cctype>
  6 
  7 inline void read(int & x)
  8 {
  9     x = 0;
 10     int k = 1;
 11     char c = getchar();
 12     while (!isdigit(c))
 13         if (c == '-') c = getchar(), k = -1;
 14         else c = getchar();
 15     while (isdigit(c))
 16         x = (x << 1) + (x << 3) + (c ^ 48),
 17         c = getchar();
 18     x *= k;
 19 }
 20 
 21 const int MAXN = 1e5 + 999;
 22 int seed = 1024, n, m, l, r, rt = 0, tot = 0, rnd[MAXN], tag[MAXN], val[MAXN], siz[MAXN], son[MAXN][2]; 
 23 
 24 inline int Rand(void)
 25 {
 26     return seed = (int)seed * 462711LL % 2147483647;
 27 }
 28 
 29 inline int New(int x)
 30 {
 31     ++tot;
 32     siz[tot] = 1;
 33     val[tot] = x;
 34     rnd[tot] = Rand();
 35     tag[tot] = son[tot][1] = son[tot][0] = 0;
 36     return tot;    
 37 }
 38 
 39 inline void Swap(int &a, int &b) 
 40 {
 41     a ^= b, b ^= a, a ^= b;
 42 }
 43 
 44 inline void Pushup(int u)
 45 {
 46     siz[u] = siz[son[u][0]] + siz[son[u][1]] + 1;
 47 }
 48 
 49 inline void Pushdown(int u)
 50 {
 51     if (!tag[u]) return;
 52     tag[son[u][0]] ^= 1;
 53     tag[son[u][1]] ^= 1;
 54     Swap(son[u][0], son[u][1]);
 55     tag[u] = 0;
 56 }
 57 
 58 inline void Split(int u, int k, int &a, int &b)
 59 {
 60     if (!u) { a = b = 0; return; }
 61     Pushdown(u);
 62     if (k <= siz[son[u][0]]) b = u, Split(son[u][0], k, a, son[b][0]);
 63     else a = u, Split(son[u][1], k - siz[son[u][0]] - 1, son[a][1], b);
 64     Pushup(u);
 65 }
 66 
 67 inline void Merge(int & u, int a, int b)
 68 {
 69     if (!a || !b) { u = a | b; return; } 
 70     if (rnd[a] < rnd[b]) u = a, Pushdown(a), Merge(son[u][1], son[a][1], b), Pushup(a);
 71     else u = b, Pushdown(b), Merge(son[u][0], a, son[b][0]), Pushup(b);
 72 }
 73 
 74 inline void Insert(int x)
 75 {
 76     int u = New(x);
 77     Merge(rt, rt, u);
 78 }
 79 
 80 inline void Print(int u)
 81 {
 82     if (!u) return;
 83     Pushdown(u);
 84     Print(son[u][0]);
 85     printf("%d ", val[u]);
 86     Print(son[u][1]);
 87 }
 88 
 89 int a, b, c;
 90 
 91 signed main()
 92 {
 93     read(n), read(m);
 94     for (int i = 1; i <= n; ++i) Insert(i);
 95     for (int i = 1; i <= m; ++i)
 96     {
 97         a = b = c = 0;
 98         read(l), read(r);
 99         Split(rt, r, a, b);
100         Split(a, l - 1, a, c);
101         tag[c] ^= 1;
102         Merge(a, a, c);
103         Merge(rt, a, b);
104     }
105     Print(rt);
106     return 0;
107 }

 

posted @ 2018-12-03 12:44  Christopher_Yan  阅读(143)  评论(0编辑  收藏  举报