一、平衡树

1、treap树

 1 int key[MAXN], weight[MAXN], child[MAXN][2], size[MAXN];
 2 int stk[MAXN], top, poi_cnt;//not use point
 3 
 4 inline int newNode(int k) {
 5     int x = (top ? stk[top--] : ++poi_cnt);
 6     key[x] = k;
 7     size[x] = 1;
 8     weight[x] = rand();
 9     child[x][0] = child[x][1] = 0;
10     return x;
11 }
12 
13 inline void update(int &x) {
14     size[x] = size[child[x][0]] + size[child[x][1]] + 1;//size[0]=0
15 }
16 
17 inline void rotate(int &x, int t) {
18     int y = child[x][t];
19     child[x][t] = child[y][t ^ 1];
20     child[y][t ^ 1] = x;
21     update(x); update(y);
22     x = y;
23 }
24 
25 void insert(int &x, int k) {
26     if (x == 0) x = newNode(k);
27     else {
28         int t = (key[x] < k);
29         insert(child[x][t], k);
30         if (weight[child[x][t]] < weight[x]) rotate(x, t);
31     }
32     update(x);
33 }
34 
35 void remove(int &x, int k) {
36     if(key[x] == k) {
37         if(child[x][0] && child[x][1]) {
38             int t = weight[child[x][0]] < weight[child[x][1]];
39             rotate(x, t); remove(child[x][t ^ 1], k);
40         }
41         else {
42             stk[++top] = x;
43             x = child[x][0] + child[x][1];
44         }
45     }
46     else remove(child[x][key[x] < k], k);
47     if(x > 0) update(x);
48 }
49 
50 int kth(int &x, int k) {
51     if(x == 0 || k <= 0 || k > size[x]) return 0;
52     int s = 0;
53     if(child[x][1]) s = size[child[x][1]];
54     if(k == s + 1) return key[x];
55     if(k <= s) return kth(child[x][1], k);
56     return kth(child[x][0], k - s - 1);
57 }
View Code

相关文章:

  • 2022-01-29
  • 2022-01-24
  • 2022-12-23
  • 2022-12-23
  • 2021-08-30
  • 2022-12-23
  • 2021-06-19
猜你喜欢
  • 2022-01-08
  • 2021-09-15
  • 2022-12-23
  • 2021-07-28
  • 2022-01-08
  • 2022-12-23
相关资源
相似解决方案