1. 程式人生 > >【模板】文藝平衡樹

【模板】文藝平衡樹

如題,是一個模板。。。

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 }