社区讨论
有旋Treap求调 79ptsWa#10-#12
P3369【模板】普通平衡树参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhj04prm
- 此快照首次捕获于
- 2025/11/03 18:33 4 个月前
- 此快照最后确认于
- 2025/11/03 18:33 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int Mod = 998244353, mod = 1e9 + 7, N = 1e5 + 10;
int cnt, n, rt;
struct no{
int l, r, pri, key, size;
} tree[N];
void update(int x) {tree[x].size = tree[tree[x].l].size + tree[tree[x].r].size + 1;}
void rotate(int& o, int op) {
int x = op ? tree[o].r : tree[o].l;
if (op) tree[o].r = tree[x].l, tree[x].l = o;
else tree[o].l = tree[x].r, tree[x].r = o;
update(x), update(o), o = x;
}
void insert(int &u, int x) {
if (!u) {tree[u = ++cnt] = {0, 0, rand(), x, 1}; return;}
tree[u].size++;
x < tree[u].key ? insert(tree[u].l, x) : insert(tree[u].r, x);
if (tree[u].l && tree[u].pri > tree[tree[u].l].pri) rotate(u, 0);
if (tree[u].r && tree[u].pri > tree[tree[u].r].pri) rotate(u, 1);
update(u);
}
void del(int &u, int x) {
if (!u) return;
if (tree[u].key == x) {
if (!tree[u].l || !tree[u].r) u = tree[u].l + tree[u].r;
else tree[tree[u].l].pri < tree[tree[u].r].pri ? rotate(u, 0), del(tree[u].r, x) : rotate(u, 1), del(tree[u].l, x);
if(u) update(u);
return;
}
x <= tree[u].key ? del(tree[u].l, x) : del(tree[u].r, x);
update(u);
}
int rk(int u, int x) {
if (!u) return 0;
return x <= tree[u].key ? rk(tree[u].l, x) : tree[tree[u].l].size + 1 + rk(tree[u].r, x);
}
int kth(int u, int x) {
if (x == tree[tree[u].l].size + 1) return tree[u].key;
return x <= tree[tree[u].l].size ? kth(tree[u].l, x) : kth(tree[u].r, x - tree[tree[u].l].size - 1);
}
int pre(int u, int x) {
if (!u) return -1e9;
if (x > tree[u].key) {
int t = pre(tree[u].r, x);
return max(t, tree[u].key);
}
return pre(tree[u].l, x);
}
int suf(int u, int x) {
if (!u) return 1e9;
if (x < tree[u].key) {
int t = suf(tree[u].l, x);
return min(t, tree[u].key);
}
return suf(tree[u].r, x);
}
int main() {
cin.tie(0) -> ios::sync_with_stdio(false);
srand(time(0));
cin >> n;
while(n--) {
int op, x;
cin >> op >> x;
if (op == 1) insert(rt, x);
if (op == 2) del(rt, x);
if (op == 3) cout << rk(rt, x) + 1 << endl;
if (op == 4) cout << kth(rt, x) << endl;
if (op == 5) cout << pre(rt, x) << endl;
if (op == 6) cout << suf(rt, x) << endl;
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...