TLE91秋条
查看原帖
TLE91秋条
741633
Ryanhao楼主2024/10/14 15:18
#include <bits/stdc++.h>
using namespace std;

struct node {
	int l, r, v, c, s;
} tree[2000005];
int ttl;

int ins(int u, int x) {
	if (ttl == 0 || u == 0) {
		ttl++;
		tree[ttl].v = x;
		tree[ttl].c = 1;
		tree[ttl].s = 1;
		return ttl;
	}
	if (x < tree[u].v) {
		tree[u].l = ins(tree[u].l, x);
	}
	else if (x > tree[u].v) {
		tree[u].r = ins(tree[u].r, x);
	}
	else {
		tree[u].c++;
	}
	tree[u].s = tree[u].c + tree[tree[u].l].s + tree[tree[u].r].s;
	return u;
}

bool del(int u, int x) {
	if (ttl == 0 || u == 0) return 0;
	bool res = 0;
	if (tree[u].v == x) {
		if (tree[u].c) {
			tree[u].c--;
			res = 1;
		}
	}
	else if (tree[u].v > x) {
		res = del(tree[u].l, x);
	}
	else {
		res = del(tree[u].r, x);
	}
	tree[u].s = tree[u].c + tree[tree[u].l].s + tree[tree[u].r].s;
	return res;
}

int rankFind(int u, int k) {
	if (ttl == 0 || u == 0) return -1;
	if (tree[tree[u].l].s >= k) return rankFind(tree[u].l, k);
	if (tree[tree[u].l].s + tree[u].c >= k) return tree[u].v;
	return rankFind(tree[u].r, k - (tree[tree[u].l].s + tree[u].c));
}
int findRank(int u, int x) {
	if (ttl == 0 || u == 0) return 1;
	if (tree[u].v == x) return tree[tree[u].l].s + 1;
	if (tree[u].v > x) return findRank(tree[u].l, x);
	return tree[tree[u].l].s + tree[u].c + findRank(tree[u].r, x);
}
int pre(int x) {
	int k = findRank(1, x);
	return rankFind(1, k - 1);
}
int next(int x) {
	int k = findRank(1, x + 1);
	return rankFind(1, k);
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int q;
	cin >> q;
	while (q--) {
		int op;
		cin >> op;
		if (op == 1) {
			int x;
			cin >> x;
			ins(1, x);
		}
		if (op == 2) {
			int x;
			cin >> x;
			del(1, x);
		}
		if (op == 3) {
			int x;
			cin >> x;
			cout << findRank(1, x) << endl;
		}
		if (op == 4) {
			int x;
			cin >> x;
			cout << rankFind(1, x) << endl;
		}
		if (op == 5) {
			int x;
			cin >> x;
			cout << pre(x) << endl;
		}
		if (op == 6) {
			int x;
			cin >> x;
			cout << next(x) << endl;
		}
	}
  return 0;
}
2024/10/14 15:18
加载中...