Logo Wy Online Judge

WyOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#108#8. 【模板】普通平衡树ryp100325ms4592kbC++142.9kb2025-04-16 23:42:522025-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