无旋treap

Posted eterna-king

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无旋treap相关的知识,希望对你有一定的参考价值。

技术图片
  1 #ifndef FHQTREAP_H_INCLUDED
  2 #define FHQTREAP_H_INCLUDED
  3 
  4 //author Eterna
  5 #define Hello The_Cruel_World!
  6 #pragma GCC optimize(2)
  7 #include<iostream>
  8 #include<algorithm>
  9 #include<cstdio>
 10 #include<string>
 11 #include<cstring>
 12 #include<vector>
 13 #include<map>
 14 #include<set>
 15 #include<queue>
 16 #include<stack>
 17 #include<utility>
 18 #include<cmath>
 19 #include<climits>
 20 #include<deque>
 21 #include<functional>
 22 #include<complex>
 23 #include<numeric>
 24 #define max(x,y) ((x)>(y)?(x):(y))
 25 #define min(x,y) ((x)<(y)?(x):(y))
 26 #define Pi acos(-1.0)
 27 #define ABS(x) ((x) >= 0 ? (x) : (-(x)))
 28 #define pb(x) push_back(x)
 29 #define lowbit(x) (x & -x)
 30 #define FRIN freopen("C:\Users\Administrator.MACHENI-KA32LTP\Desktop\in.txt", "r", stdin)
 31 #define FROUT freopen("C:\Users\Administrator.MACHENI-KA32LTP\Desktop\out.txt", "w", stdout)
 32 #define FAST ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
 33 using namespace std;
 34 typedef long long ll;
 35 typedef unsigned long long ull;
 36 typedef pair<int, int> pii;
 37 const int maxn = 1e5;
 38 const int INF = 0x7fffffff;
 39 const int mod = 1e9 + 7;
 40 const double eps = 1e-7;
 41 inline int read_int() {
 42     char c;
 43     int ret = 0, sgn = 1;
 44     do { c = getchar(); } while ((c < 0 || c > 9) && c != -);
 45     if (c == -) sgn = -1; else ret = c - 0;
 46     while ((c = getchar()) >= 0 && c <= 9) ret = ret * 10 + (c - 0);
 47     return sgn * ret;
 48 }
 49 inline ll read_ll() {
 50     char c;
 51     ll ret = 0, sgn = 1;
 52     do { c = getchar(); } while ((c < 0 || c > 9) && c != -);
 53     if (c == -) sgn = -1; else ret = c - 0;
 54     while ((c = getchar()) >= 0 && c <= 9) ret = ret * 10 + (c - 0);
 55     return sgn * ret;
 56 }
 57 struct node {
 58     int value, key, Size, child[2];
 59 }arr[maxn + 5];
 60 int tot;
 61 inline void Push_Up(int index) {
 62     arr[index].Size = arr[arr[index].child[0]].Size + arr[arr[index].child[1]].Size + 1;
 63 }
 64 void Split_By_Size(int root, int& a, int& b, int k) {
 65     if (!root) {
 66         a = b = 0;
 67         return;
 68     }
 69     if (arr[arr[root].child[0]].Size < k) a = root, Split_By_Size(arr[root].child[1], arr[a].child[1], b, k - arr[arr[root].child[0]].Size - 1);
 70     else b = root, Split_By_Size(arr[root].child[0], a, arr[b].child[0], k);
 71     Push_Up(root);
 72 }
 73 void Split_By_Value(int root, int& a, int& b, int value) {
 74     if (!root) {
 75         a = b = 0;
 76         return;
 77     }
 78     if (arr[root].value <= value)a = root, Split_By_Value(arr[root].child[1], arr[a].child[1], b, value);
 79     else b = root, Split_By_Value(arr[root].child[0], a, arr[b].child[0], value);
 80     Push_Up(root);
 81 }
 82 void Merge(int& root, int a, int b) {
 83     if (!a || !b) {
 84         root = a + b;
 85         return;
 86     }
 87     if (arr[a].key < arr[b].key)root = a, Merge(arr[root].child[1], arr[a].child[1], b);
 88     else root = b, Merge(arr[root].child[0], a, arr[b].child[0]);
 89     Push_Up(root);
 90 }
 91 inline void Insert(int& root, int value) {
 92     int x = 0, y = 0, z = ++tot;
 93     arr[z].value = value, arr[z].key = rand(), arr[z].Size = 1;
 94     Split_By_Value(root, x, y, value);
 95     Merge(x, x, z);
 96     Merge(root, x, y);
 97 }
 98 inline void Erase(int& root, int value) {
 99     int x = 0, y = 0, z = 0;
100     Split_By_Value(root, x, y, value);
101     Split_By_Value(x, x, z, value - 1);
102     Merge(z, arr[z].child[0], arr[z].child[1]);
103     Merge(x, x, z);
104     Merge(root, x, y);
105 }
106 int Kth_number(int root, int k) {
107     while (arr[arr[root].child[0]].Size + 1 != k) {
108         if (arr[arr[root].child[0]].Size >= k)root = arr[root].child[0];
109         else k -= (arr[arr[root].child[0]].Size + 1), root = arr[root].child[1];
110     }
111     return arr[root].value;
112 }
113 int Get_Rank(int& root, int value) {
114     int x = 0, y = 0;
115     Split_By_Value(root, x, y, value - 1);
116     int res = arr[x].Size + 1;
117     Merge(root, x, y);
118     return res;
119 }
120 int Predecessor(int& root, int value) {
121     int x = 0, y = 0;
122     Split_By_Value(root, x, y, value - 1);
123     int res = Kth_number(x, arr[x].Size);
124     Merge(root, x, y);
125     return res;
126 }
127 int Successor(int& root, int value) {
128     int x = 0, y = 0;
129     Split_By_Value(root, x, y, value);
130     int res = Kth_number(y, 1);
131     Merge(root, x, y);
132     return res;
133 }
134 int n, op, u, root;
135 int main()
136 {
137     srand(19260817);
138     scanf("%d", &n);
139     while (n--) {
140         scanf("%d %d", &op, &u);
141         if (op == 1)Insert(root, u);
142         if (op == 2)Erase(root, u);
143         if (op == 3)printf("%d
", Get_Rank(root, u));
144         if (op == 4)printf("%d
", Kth_number(root, u));
145         if (op == 5)printf("%d
", Predecessor(root, u));
146         if (op == 6)printf("%d
", Successor(root, u));
147     }
148     return 0;
149 }
150 
151 
152 
153 
154 #endif // FHQTREAP_H_INCLUDED
View Code

 

以上是关于无旋treap的主要内容,如果未能解决你的问题,请参考以下文章

[代码] bzoj 1500 维修数列(无旋treap)

[代码] bzoj 3224 普通平衡树(无旋treap)

无旋Treap

无旋Treap

模板 - 数据结构 - 无旋Treap / FHQ Treap

[您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)