不知道哪里错了
查看原帖
不知道哪里错了
464528
见贤思齐_Seakies楼主2022/5/1 18:48
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int inf = 1e9;
int treap[MAXN][2], key[MAXN], val[MAXN], size[MAXN], cnt[MAXN];
int tot, root;
int get_new(int o) {
	key[++tot] = o;
	val[tot] = rand();
	size[tot] = cnt[tot] = 1;
	return tot;
}
void push_up(int o) {
	size[o] = size[treap[o][0]] + size[treap[o][1]] + cnt[o];
}
void build() {
	root = get_new(-inf), treap[root][1] = get_new(inf);
	push_up(root);
}
void rotate(int &o, int d) {
	int son = treap[o][d ^ 1];
	treap[o][d ^ 1] = treap[son][d];
	treap[son][d] = o;
	o = son;
	push_up(treap[o][d]);
	push_up(o);
}
void insert(int &o, int v) {
	if (!o) {
		o = get_new(v);
		return;
	}
	if (v == key[o]) cnt[o]++;
	else {
		int d = v < key[o] ? 0 : 1;
		insert(treap[o][d], v);
		if (val[o] < val[treap[o][d]]) rotate(o, d ^ 1);
	}
	push_up(o);
}
void remove(int &o, int v) {
	if (!o) return;
	if (v == key[o]) {
		if (cnt[o] > 1) {
			cnt[o]--;
			push_up(o);
			return;
		}
		if (treap[o][0] || treap[o][1]) {
			if (!treap[o][1] || val[treap[o][0]] > val[treap[o][1]]) {
				rotate(o, 1);
				remove(treap[o][1], v);
			} else {
				rotate(o, 0);
				remove(treap[o][0], v);
			}
			push_up(o);
		} else o = 0;
		return;
	}
	v < key[o] ? remove(treap[o][0], v) : remove(treap[o][1], v);
	push_up(o);
}
int find_rank(int o, int v) {
	if (!o) return 0;
	if (v == key[o]) return size[treap[o][0]] + 1;
	else if (v < key[o]) return find_rank(treap[o][0], v);
	else return find_rank(treap[o][1], v) + cnt[o] + size[treap[o][0]];
}
int find_key(int o, int rank) {
	if (!o) return inf;
	if (rank <= size[treap[o][0]]) return find_key(treap[o][0], rank);
	else if (rank <= size[treap[o][0]] + cnt[o]) return key[o];
	else return find_rank(treap[o][1], rank - size[treap[o][0]] - cnt[o]);
}
int find_pre(int v) {
	int o = root, pre;
	while (o) {
		if (key[o] < v) {
			pre = key[o];
			o = treap[o][1];
		} else o = treap[o][0];
	}
	return pre;
}
int find_nxt(int v) {
	int o = root, nxt;
	while (o) {
		if (key[o] > v) {
			nxt = key[o];
			o = treap[o][0];
		} else o = treap[o][1];
	}
	return nxt;
}
int main() {
	int n;
	cin >> n;
	build();
	while (n--) {
		int op, x;
		cin >> op >> x;
		if (op == 1) insert(root, x);
		else if (op == 2) remove(root, x);
		else if (op == 3) cout << find_rank(root, x) - 1 << endl;
		else if (op == 4) cout << find_key(root, x + 1) << endl;
		else if (op == 5) cout << find_pre(x) << endl;
		else cout << find_nxt(x) << endl;
	}
	return 0;
}
2022/5/1 18:48
加载中...