平衡树学了1ms求助
查看原帖
平衡树学了1ms求助
214696
Dry_ice楼主2022/10/8 10:51

0pts TLE+WA

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
template<typename Tp>
inline void Read(Tp &x) {
	x = 0; bool w = 0; char c = getchar();
	for (; c < '0' || c > '9'; c = getchar()) if (c == '-') w ^= 1;
	for (; c >= '0' && c <= '9'; c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
	if (w) x = -x;
}
const int N = (int)5e5 + 5;
int ch[N][2], val[N], pri[N], sz[N], siz;
inline int New(int key) {
	sz[++siz] = 1, val[siz] = key;
	pri[siz] = rand(); return siz;
}
inline void Update(int x) {
	sz[x] = sz[ch[x][0]] + sz[ch[x][1]];
}
inline void Split(int now, int key, int &x, int &y) {
	if (!now) x = y = 0;
	else {
		if (val[now] <= key) x = now, Split(ch[now][1], key, ch[now][1], y);
		else y = now, Split(ch[now][0], key, x, ch[now][0]);
		Update(now);
	}
}
inline int Merge(int x, int y) {
	if (!x || !y) return x + y;
	if (pri[x] < pri[y]) {
		ch[x][1] = Merge(ch[x][1], y);
		Update(x); return x;
	}
	else {
		ch[y][0] = Merge(x, ch[y][0]);
		Update(y); return y;
	}
}
inline int Kth(int now, int k) {
	while (1) {
		if (k <= sz[ch[now][0]]) now = ch[now][0];
		else
			if (k == sz[ch[now][0]] + 1) return now;
			else k -= sz[ch[now][0]] + 1, now = ch[now][1];
	}
}
inline void Insert(int key, int &rt) {
	int x, y; Split(rt, key, x, y);
	rt = Merge(x, Merge(New(key), y));
}
inline void Del(int key, int &rt) {
	int x, y, z; x = y = z = 0;
	Split(rt, key, x, z); Split(x, key - 1, x, y);
	rt = Merge(Merge(x, y = Merge(ch[y][0], ch[y][1])), z);
}
int n, rt[N];
int main(void) {
	int Q, ver, opt, x, y, z; Read(Q);
	for (int i = 1; i <= Q; ++i) {
		Read(ver), Read(opt), Read(x);
		rt[i] = rt[ver];
		switch (opt) {
			case 1: Insert(x ,rt[i]); break;
			case 2: Del(x, rt[i]); break;
			case 3: y = z = 0; Split(rt[i], x - 1, y, z);
					printf("%d\n", sz[y] + 1); break;
			case 4: printf("%d\n", val[Kth(rt[i], x)]); break;
			case 5: y = z = 0; Split(rt[i], x - 1, y, z);
					if (!y) printf("%d\n", -(1ll << 31) + 1);
					else printf("%d\n", val[Kth(y, sz[y])]), rt[i] = Merge(y, z);
					break;
			default: y = z = 0; Split(rt[i], x, y, z);
					if (!y) printf("%d\n", 1ll << 31 - 1);
					else printf("%d\n", val[Kth(z, 1)]), rt[i] = Merge(y, z);
		}
	}
	return 0;
}
2022/10/8 10:51
加载中...