1 条题解
-
1
#include <bits/stdc++.h> using namespace std; int q, n = 0, root = 0, aa, bb, cc, dd; int w[100003], siz[100003], ls[100003], rs[100003], val[100003]; void upd(int x) { siz[x] = siz[ls[x]] + siz[rs[x]] + 1; } int merge(int x, int y) { if (!x || !y) return x + y; upd(x), upd(y); if (w[x] <= w[y]) { rs[x] = merge(rs[x], y); upd(x); return x; } else { ls[y] = merge(x, ls[y]); upd(y); return y; } } void split(int x, int k, int &aa, int &bb) { if (!x) { aa = bb = 0; return; } if (val[x] <= k) { aa = x; split(rs[x], k, rs[x], bb); } else { bb = x; split(ls[x], k, aa, ls[x]); } upd(x); } void insert(int x) { w[++n] = rand(); val[n] = x; siz[n] = 1; split(root, x, aa, bb); root = merge(merge(aa, n), bb); } void delet(int x) { split(root, x, aa, bb); split(aa, x - 1, cc, dd); dd = merge(ls[dd], rs[dd]); root = merge(cc, merge(dd, bb)); } int rk(int x, int k) { split(root, k - 1, aa, bb); int l = siz[aa] + 1; root = merge(aa, bb); return l; } int vall(int x, int k) { if (siz[ls[x]] + 1 == k) return val[x]; else if (k <= siz[ls[x]]) return vall(ls[x], k); else return vall(rs[x], k - siz[ls[x]] - 1); } int pre(int x) { return vall(root, rk(root, x) - 1); } int aft(int x) { return vall(root, rk(root, x + 1)); } int main() { scanf("%d", &q); while (q--) { int opt, x; scanf("%d %d", &opt, &x); if (opt == 1) insert(x); if (opt == 2) delet(x); if (opt == 3) printf("%d\n", rk(root, x)); if (opt == 4) printf("%d\n", vall(root, x)); if (opt == 5) printf("%d\n", pre(x)); if (opt == 6) printf("%d\n", aft(x)); } return 0; }
- 1
信息
- ID
- 5535
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者