洛谷P3369 【模板】普通平衡树 FHQ Treap
题目链接:https://www.luogu.com.cn/problem/P3369
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
mt19937 rng(time(0));
struct Node {
int ls, rs, key, pri, sz;
Node() {}
Node(int _key) { ls = rs = 0; key = _key; pri = rng(); sz = 1; }
} tr[maxn];
int rt, idx;
void push_up(int u) {
int ls = tr[u].ls, rs = tr[u].rs;
tr[u].sz = tr[ls].sz + tr[rs].sz + 1;
}
void split(int u, int x, int &L, int &R) {
if (!u) {
L = R = 0;
return;
}
if (tr[u].key <= x) {
L = u;
split(tr[u].rs, x, tr[u].rs, R);
}
else {
R = u;
split(tr[u].ls, x, L, tr[u].ls);
}
push_up(u);
}
int merge(int L, int R) {
if (!L || !R) return L + R;
if (tr[L].pri > tr[R].pri) {
tr[L].rs = merge(tr[L].rs, R);
push_up(L);
return L;
}
else {
tr[R].ls = merge(L, tr[R].ls);
push_up(R);
return R;
}
}
void ins(int x) {
int L, R;
split(rt, x, L, R);
tr[++idx] = Node(x);
rt = merge(merge(L, idx), R);
}
void del(int x) {
int L, R, p;
split(rt, x, L, R);
split(L, x-1, L, p);
p = merge(tr[p].ls, tr[p].rs);
rt = merge(merge(L, p), R);
}
int rnk(int x) {
int L, R;
split(rt, x-1, L, R);
int rk = tr[L].sz + 1;
rt = merge(L, R);
return rk;
}
int kth(int u, int k) {
while (u) {
int sz = tr[tr[u].ls].sz;
if (sz + 1 == k)
return u;
else if (sz >= k)
u = tr[u].ls;
else
k -= sz + 1,
u = tr[u].rs;
}
assert(1 == 0);
return -1; // 不会到这一行
}
int pre(int x) {
int L, R;
split(rt, x-1, L, R);
int res = kth(L, tr[L].sz);
rt = merge(L, R);
return res;
}
int nxt(int x) {
int L, R;
split(rt, x, L, R);
int res = kth(R, 1);
rt = merge(L, R);
return res;
}
int n, op, x;
int main() {
scanf("%d", &n);
while (n--) {
scanf("%d%d", &op, &x);
if (op == 1)
ins(x);
else if (op == 2)
del(x);
else if (op == 3)
printf("%d\n", rnk(x));
else if (op == 4)
printf("%d\n", tr[ kth(rt, x) ].key);
else if (op == 5)
printf("%d\n", tr[ pre(x) ].key);
else if (op == 6)
printf("%d\n", tr[ nxt(x) ].key);
}
return 0;
}
浙公网安备 33010602011771号