• 【模板】文艺平衡树


    如题,是一个模板。。。

    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 }
  • 相关阅读:
    Redis教程16-服务器
    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
    剑指 Offer 18. 删除链表的节点
    剑指 Offer 16. 数值的整数次方
    通过GetLastError 获取win32 api 的错误信息
    Windows API 错误码
    VS2012程序打包部署详解
    C#中子类调用父类的实现方法
    获取有关编程语言的帮助?
    Windows API 错误码解析
  • 原文地址:https://www.cnblogs.com/yanyiming10243247/p/10057820.html
Copyright © 2020-2023  润新知