记录编号 |
590758 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[Tyvj 1728]普通平衡树 |
最终得分 |
100 |
用户昵称 |
yrtiop |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.514 s |
提交时间 |
2024-07-11 11:06:38 |
内存使用 |
5.35 MiB |
显示代码纯文本
// 大家好啊,今天来点大家想看的东西啊。
#include <bits/stdc++.h>
#define pb emplace_back
#define fir first
#define sec second
using i64 = long long;
using u32 = unsigned;
using pii = std::pair<int, int>;
constexpr int maxn = 1e5 + 5;
std::mt19937 rd((unsigned)time(0));
struct node {
int ls, rs, val, siz;
u32 key;
node() { ls = rs = val = key = siz = 0; }
node(int ls, int rs, int val, u32 key, int siz) : ls(ls), rs(rs), val(val), key(key), siz(siz) {}
} tr[maxn];
int num, rt;
int NewNode(int x) {
return tr[++num] = node(0, 0, x, rd(), 1), num;
}
void pushup(int x) {
return tr[x].siz = tr[tr[x].ls].siz + tr[tr[x].rs].siz + 1, void();
}
void split(int p, int val, int& x, int& y) {
if (!p) return x = y = 0, void();
if (tr[p].val <= val) {
x = p;
split(tr[x].rs, val, tr[x].rs, y);
} else {
y = p;
split(tr[y].ls, val, x, tr[y].ls);
}
return pushup(p);
}
int merge(int x, int y) {
if (!x || !y) return x | y;
if (tr[x].key <= tr[y].key) {
tr[x].rs = merge(tr[x].rs, y);
return pushup(x), x;
} else {
tr[y].ls = merge(x, tr[y].ls);
return pushup(y), y;
}
}
void insert(int x) {
int a, b, c;
split(rt, x, a, c);
b = NewNode(x);
return rt = merge(a, merge(b, c)), void();
}
void remove(int x) {
int a, b, c;
split(rt, x, b, c), split(b, x - 1, a, b);
return rt = merge(a, merge(merge(tr[b].ls, tr[b].rs), c)), void();
}
int findrk(int x) {
int a, b, r;
split(rt, x - 1, a, b);
r = tr[a].siz + 1;
return rt = merge(a, b), r;
}
void splitrk(int p, int rk, int& x, int& y) {
if (!p) return x = y = 0, void();
if (tr[tr[p].ls].siz + 1 <= rk) {
x = p;
splitrk(tr[p].rs, rk - 1 - tr[tr[p].ls].siz, tr[x].rs, y);
} else {
y = p;
splitrk(tr[p].ls, rk, x, tr[y].ls);
}
return pushup(p);
}
int findval(int k) {
int a, b;
splitrk(rt, k, a, b);
int tmp = a;
while (tr[tmp].rs) tmp = tr[tmp].rs;
tmp = tr[tmp].val;
return rt = merge(a, b), tmp;
}
int precur(int x) {
return findval(findrk(x) - 1);
}
int suffix(int x) {
return findval(findrk(x + 1));
}
int main() {
freopen("phs.in", "r", stdin);
freopen("phs.out", "w", stdout);
std::cin.tie(nullptr)->sync_with_stdio(false);
int n;
std::cin >> n;
while (n--) {
int opt, x;
std::cin >> opt >> x;
if (opt == 1) {
insert(x);
} else if (opt == 2) {
remove(x);
} else if (opt == 3) {
std::cout << findrk(x) << '\n';
} else if (opt == 4) {
std::cout << findval(x) << '\n';
} else if (opt == 5) {
std::cout << precur(x) << '\n';
} else {
std::cout << suffix(x) << '\n';
}
}
return 0;
}