ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#207 | #8. 【模板】普通平衡树 | jxy2012 | 100 | 342ms | 4640kb | C++14 | 2.7kb | 2025-04-18 11:43:19 | 2025-04-18 11:43:21 |
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
const int N = 200005;
const int INF = 0x3f3f3f3f;
mt19937 sj(114514);
struct FHQ {
int ls, rs, key, sz, val;
} fhq[N];
int root, T1, T2, T3, ck;
int xj(int v) {
fhq[++ck] = {0, 0, (int)sj(), 1, v};
return ck;
}
void push_up(int u) {
fhq[u].sz = fhq[fhq[u].ls].sz + fhq[fhq[u].rs].sz + 1;
}
void split(int u, int v, int& x, int& y) {
if (!u) {
x = y = 0;
return;
}
if (fhq[u].val > v) {
y = u;
split(fhq[u].ls, v, x, fhq[u].ls);
} else {
x = u;
split(fhq[u].rs, v, fhq[u].rs, y);
}
push_up(u);
}
int merge(int x, int y) {
if (!x || !y) {
return x + y;
}
if (fhq[x].key > fhq[y].key) {
fhq[x].rs = merge(fhq[x].rs, y);
push_up(x);
return x;
} else {
fhq[y].ls = merge(x, fhq[y].ls);
push_up(y);
return y;
}
}
void insert(int v) {
split(root, v, T1, T2);
root = merge(merge(T1, xj(v)), T2);
}
void erase(int x) {
split(root, x, T1, T2);
split(T1, x - 1, T1, T3);
T3 = merge(fhq[T3].ls, fhq[T3].rs);
root = merge(merge(T1, T3), T2);
}
int find_rank(int x) {
split(root, x - 1, T1, T2);
int res = fhq[T1].sz + 1;
root = merge(T1, T2);
return res;
}
int kth(int k) {
int u = root;
while (u) {
int tmp = fhq[fhq[u].ls].sz + 1;
if (tmp == k) {
break;
} else if (k < tmp) {
u = fhq[u].ls;
} else {
k -= tmp;
u = fhq[u].rs;
}
}
return fhq[u].val;
}
int find_pre(int u, int v) {
if (u == 0)
return -INF;
if (fhq[u].val < v) {
int res = find_pre(fhq[u].rs, v);
return res == -INF ? fhq[u].val : res;
} else {
return find_pre(fhq[u].ls, v);
}
}
int find_next(int u, int v) {
if (u == 0)
return INF;
if (fhq[u].val > v) {
int res = find_next(fhq[u].ls, v);
return res == INF ? fhq[u].val : res;
} else {
return find_next(fhq[u].rs, v);
}
}
int main() {
int _;
scanf("%d", &_);
while (_--) {
int op, x;
scanf("%d%d", &op, &x);
if (op == 1) {
insert(x);
} else if (op == 2) {
erase(x);
} else if (op == 3) {
printf("%d\n", find_rank(x));
} else if (op == 4) {
printf("%d\n", kth(x));
} else if (op == 5) {
printf("%d\n", find_pre(root, x));
} else {
printf("%d\n", find_next(root, x));
}
}
return 0;
}
详细
小提示:点击横条可展开更详细的信息
Test #1:
score: 11
Accepted
time: 1ms
memory: 3548kb
input:
20 1 964673 5 968705 4 1 3 964673 5 965257 1 915269 1 53283 3 964673 3 53283 3 53283 1 162641 5 9739...
output:
964673 964673 1 964673 3 1 1 964673 964673
result:
ok 9 numbers
Test #2:
score: 11
Accepted
time: 1ms
memory: 3476kb
input:
50 1 577793 1 408221 1 880861 2 408221 1 460353 1 223489 6 577713 4 2 5 889905 2 880861 1 100033 1 7...
output:
577793 460353 880861 577793 577793 100033 22575 22575 1 100033 643621 632329 643621 4 6 13 737721
result:
ok 17 numbers
Test #3:
score: 11
Accepted
time: 3ms
memory: 3548kb
input:
100 1 914241 1 639471 5 917713 6 912745 1 234811 1 297728 3 297728 1 6927 5 645391 1 664569 2 914241...
output:
914241 914241 2 639471 842266 6927 868271 297728 568845 639471 11 286545 234811 9 639471 531105 5311...
result:
ok 39 numbers
Test #4:
score: 11
Accepted
time: 4ms
memory: 3492kb
input:
1000 1 543050 1 599175 6 538214 1 208361 1 415495 1 376755 5 599771 6 415415 1 460416 3 599175 1 413...
output:
543050 599175 415495 6 599175 3 460416 430219 543050 8 838037 413857 543050 413857 14 17 60423 46041...
result:
ok 415 numbers
Test #5:
score: 11
Accepted
time: 11ms
memory: 3592kb
input:
10000 1 27217 5 30155 4 1 1 454393 6 453417 1 311109 1 172817 1 303817 1 446169 1 674881 4 1 6 44439...
output:
27217 27217 454393 27217 446169 303817 454393 674881 454393 454393 839081 839081 9 180795 674881 898...
result:
ok 3928 numbers
Test #6:
score: 11
Accepted
time: 48ms
memory: 4040kb
input:
50000 1 5227 6 -1792 6 445 1 175483 2 5227 1 562399 2 175483 1 956113 4 1 1 487125 1 851001 1 233057...
output:
5227 5227 562399 3 233057 3 40129 487125 3 40129 508946 7 478150 3 20 275201 487125 319065 487125 56...
result:
ok 19932 numbers
Test #7:
score: 11
Accepted
time: 90ms
memory: 4268kb
input:
100000 1 288297 1 535013 3 288297 1 457318 2 457318 3 535013 1 103045 1 964881 1 514921 1 640601 1 5...
output:
1 2 2 288297 103045 5 7 103045 524478 13 3 3 553201 4 349197 612362 199958 349197 535013 23 847953 5...
result:
ok 39610 numbers
Test #8:
score: 11
Accepted
time: 95ms
memory: 4640kb
input:
100000 1 634561 6 630913 1 254516 6 630481 1 966881 1 18529 1 873593 3 254516 2 966881 3 254516 4 1 ...
output:
634561 634561 2 2 18529 18529 634561 634561 1 74233 5 695277 74233 14 9 800499 74233 800499 6 14 873...
result:
ok 39797 numbers
Test #9:
score: 11
Accepted
time: 89ms
memory: 4324kb
input:
100000 1 104152 1 405622 4 2 1 564237 1 290523 1 441856 1 910218 1 97083 1 104393 1 485841 3 910218 ...
output:
405622 9 290523 97083 7 104393 438977 12 485841 1 86501 86501 735257 405622 290523 874917 438977 851...
result:
ok 39516 numbers