ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#108 | #8. 【模板】普通平衡树 | ryp | 100 | 325ms | 4592kb | C++14 | 2.9kb | 2025-04-16 23:42:52 | 2025-04-16 23:42:53 |
answer
#include <iostream>
#define pc putchar
using namespace std;
const int N = 1e5 + 10, inf = 1e9;
int fa[N], son[N][2], siz[N], cntq[N], val[N], cnt = 0, rt = 0;
void push_up (int x) { siz[x] = siz[son[x][0]] + siz[son[x][1]] + cntq[x]; }
int get (int x) { return x == son[fa[x]][1]; }
int compare (int x, int k) { return k > val[x]; }
void rotate (int x)
{
int y = fa[x], z = fa[y], p = get (x);
son[y][p] = son[x][p ^ 1];
if (son[x][p ^ 1]) fa[son[x][p ^ 1]] = y;
fa[fa[son[x][p ^ 1] = y] = x] = z;
if (z) son[z][y == son[z][1]] = x;
push_up (y), push_up (x);
}
int splay (int x, int t = 0)
{
for (int f = fa[x]; (f = fa[x]) != t; rotate (x))
if (fa[f] != t) rotate (get (x) == get (f) ? f : x);
return t ? x : rt = x;
}
int insert_at (int f, int k)
{
++cnt, fa[cnt] = f, siz[cnt] = cntq[cnt] = 1, val[cnt] = k;
if (f) son[f][compare (f, k)] = cnt;
return cnt;
}
void insert (int k)
{
int f = rt, last = 0;
if (!f) return rt = insert_at (0, k), void ();
while (f && val[f] != k) last = f, f = son[f][compare (f, k)];
if (f && val[f] == k) siz[f]++, cntq[f]++;
else f = insert_at (last, k);
splay (f);
}
int find (int k)
{
int f = rt;
if (!f) return 0;
while (val[f] != k && son[f][compare (f, k)]) f = son[f][compare (f, k)];
return splay (f);
}
int qrank (int k)
{
return siz[son[find (k)][0]] + (val[rt] < k ? cntq[rt] : 0);
}
int kth (int k)
{
int f = rt;
while (f)
if (k <= siz[son[f][0]]) f = son[f][0];
else if (k <= siz[son[f][0]] + cntq[f]) return splay (f);
else k -= siz[son[f][0]] + cntq[f], f = son[f][1];
return 0;
}
int merge (int x, int y)
{
int f = x;
if (!x || !y) return x + y;
while (son[f][1]) f = son[f][1];
fa[son[splay (f, fa[x])][1] = y] = f;
return f;
}
void remove (int k)
{
int f = find (k), x;
if (cntq[f] > 1) return cntq[f]--, siz[f]--, void ();
if ((x = merge (son[f][0], son[f][1]))) fa[x] = 0;
rt = x;
}
int qpre (int k)
{
int f = son[find (k)][0];
if (val[rt] < k) return rt;
while (son[f][1]) f = son[f][1];
return splay (f);
}
int qnxt (int k)
{
int f = son[find (k)][1];
if (val[rt] > k) return rt;
while (son[f][0]) f = son[f][0];
return splay (f);
}
int read (void)
{
int res = 0, s = 1;
char c;
while (!isdigit (c = getchar ())) if (c == '-') s = -1;
do res = res * 10 + c - '0'; while (isdigit (c = getchar ()));
return res * s;
}
void write (int x)
{
char s[60];
int i = 0;
if (x < 0) pc ('-'), x = -x;
do s[++i] = x % 10 + '0', x /= 10; while (x);
while (i) pc (s[i--]);
pc ('\n');
}
int main (void)
{
int n = read ();
insert (inf), insert (-inf);
while (n--) {
int t = read (), k = read ();
switch (t) {
case 1: insert (k); break;
case 2: remove (k); break;
case 3: write (qrank (k)); break;
case 4: write (val[kth (k + 1)]); break;
case 5: write (val[qpre (k)]); break;
case 6: write (val[qnxt (k)]); break;
}
}
return 0;
}
Details
小提示:点击横条可展开更详细的信息
Test #1:
score: 11
Accepted
time: 1ms
memory: 3144kb
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: 3ms
memory: 3176kb
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: 3212kb
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: 2ms
memory: 3440kb
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: 12ms
memory: 3600kb
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: 46ms
memory: 4060kb
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: 86ms
memory: 4592kb
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: 86ms
memory: 4400kb
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: 86ms
memory: 4320kb
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