1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5 + 10; 4 int n, opt, x, val[N], fa[N], sze[N], sum[N], lc[N], rc[N], T, rt; 5 void pushup(int k) { 6 sze[k] = sze[lc[k]] + sze[rc[k]] + sum[k]; 7 } 8 void rot(int x) { 9 int y = fa[x], z = fa[y]; 10 int b = (x == lc[y]) ? rc[x] : lc[x]; 11 fa[x] = z, fa[y] = x; 12 if (b) fa[b] = y; 13 if (z) (lc[z] == y ? lc[z] : rc[z]) = x; 14 if (x == lc[y]) rc[x] = y, lc[y] = b; 15 else lc[x] = y, rc[y] = b; 16 pushup(y); 17 } 18 bool Wrt(int x) { 19 return rc[fa[x]] == x; 20 } 21 void Splay(int x, int tar) { 22 while (fa[x] != tar) { 23 if (fa[fa[x]] != tar) 24 Wrt(x) == Wrt(fa[x]) ? rot(fa[x]) : rot(x); 25 rot(x); 26 } 27 if (!tar) rt = x; 28 pushup(x); 29 } 30 void ins(int k) {//插入元素k 31 int x = rt, y = 0, d; 32 while (x) { 33 ++ sze[y = x]; 34 if (k == val[x]) {sum[x] ++; return ;} 35 if (k < val[x]) x = lc[x], d = 0; 36 else x = rc[x], d = 1; 37 } 38 x = ++ T; fa[x] = y; sze[x] = sum[x] = 1; val[x] = k; 39 if (y) (d == 0 ? lc[y] : rc[y]) = x; 40 Splay(x, 0); 41 } 42 int Rank(int k, bool f) { //按数值找 0:位置 1:排名 43 int x = rt, ret = 0; 44 while (x) { 45 if (val[x] == k) return f ? ret + sze[lc[x]] + 1 : x; 46 if (val[x] > k) x = lc[x]; 47 else ret += sze[lc[x]] + sum[x], x = rc[x]; 48 } 49 return f ? ret : 0; 50 } 51 int find(int k) {//按排名找 52 int x = rt; 53 while (x) { 54 if (sze[lc[x]] >= k) x = lc[x]; 55 else if (sze[lc[x]] + sum[x] >= k) return val[x]; 56 else k -= (sze[lc[x]] + sum[x]), x = rc[x]; 57 } 58 return val[x]; 59 } 60 void del(int k) {//删除元素k所在节点 61 int x = Rank(k, 0); 62 Splay(x, 0); 63 if (sum[x] > 1) { 64 -- sze[x]; -- sum[x]; return ; 65 } 66 fa[lc[x]] = fa[rc[x]] = 0; 67 if (!lc[x] || !rc[x]) rt = lc[x] + rc[x]; 68 else { 69 int w = lc[x]; 70 while(rc[w]) w = rc[w]; 71 Splay(w, 0); 72 rc[w] = rc[x]; fa[rc[x]] = w; 73 pushup(w); 74 } 75 } 76 int pre(int k) {//求前驱 77 int x = rt, ret = 0; 78 while (x) { 79 if (val[x] < k) ret = val[x], x = rc[x]; 80 else x = lc[x]; 81 } 82 return ret; 83 } 84 int aft(int k) {//求后继 85 int x = rt, ret = 0; 86 while (x) { 87 if (val[x] > k) ret = val[x], x = lc[x]; 88 else x = rc[x]; 89 } 90 return ret; 91 } 92 signed main() { 93 scanf("%d", &n); 94 while (n --) { 95 scanf("%d %d", &opt, &x); 96 if (opt == 1) ins(x); 97 if (opt == 2) del(x); 98 if (opt == 3) cout << Rank(x,1) << '\n'; 99 if (opt == 4) cout << find(x) << '\n'; 100 if (opt == 5) cout << pre(x) << '\n'; 101 if (opt == 6) cout << aft(x) << '\n'; 102 } 103 return 0; 104 }
标签:lc,val,fa,LOJ,sze,int,rc,平衡,104 From: https://www.cnblogs.com/YHxo/p/16770243.html