替罪羊树91pts tie #10 求调
查看原帖
替罪羊树91pts tie #10 求调
1188058
141300hxl楼主2024/3/15 10:31
#include <bits/stdc++.h>
using namespace std;
double ahpla = 0.2;
int n, m, opt[100001], x[100001], b[100001];
struct node {
	int val, num, size, sd, ls, rs;
} re[100001];
int tot, root;
int add(int val, int num) {
	re[++tot] = {val, num, num, 1, 0, 0};
	return tot;
}
void pushup(int p) {
	re[p].size = re[re[p].ls].size + re[re[p].rs].size + re[p].num;
	re[p].sd = re[re[p].ls].sd + re[re[p].rs].sd + bool(re[p].num);
}
bool can(int p) {
	if (re[p].num && (re[p].size * ahpla >= max(re[re[p].ls].size, re[re[p].rs].size) || re[p].sd <= ahpla * re[p].size) )return 1;
	return 0;
}
int st[100001];
int top;
void heisou(int p) {
	if (!p) return;
	if (re[p].ls) heisou(re[p].ls);
	if (re[p].num) st[top++] = p;
	if (re[p].rs) heisou(re[p].rs);
}
int rt(int l, int r) {
	int mid = (l + r) / 2;
	if (l >= r) return 0;
	re[st[mid]].ls = rt(l, mid);
	re[st[mid]].rs = rt(mid + 1, r);
	pushup(st[mid]);
	return st[mid];
}
void rg(int &p) {
	if (!can(p)) return ;
	top = 0;
	heisou(p);
	p = rt(0, top);
}
void init() {
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> opt[i] >> x[i];
}
void insert(int val, int t = root) {
	if (!t) {
		t = add(val, 1);
		return ;
	}
	int pa = t,o=-1;
	while (t && re[t].val != val) {
		if (re[t].val < val) {
			pa = t;
			o=0;
			t = re[t].ls;
		} else if (re[t].val > val) {
			pa = t;
			o=1;
			t = re[t].rs;
		}
	}
	t = add(val, 1);
	if()
	pushup(t);
	rg(t);
}
void del(int val, int t = root) {
	if (re[t].val == val)
		re[t].num--;
	if (val < re[t].val) del(val, re[t].ls);
	if (val > re[t].val) del(val, re[t].rs);
	pushup(t);
	rg(t);
}
int findkth(int x, int t = root) {
	if (!t) return 0;
	if (x <= re[re[t].ls].size) return findkth(x, re[t].ls);
	if (x <= re[re[t].ls].size + re[t].num) return re[t].val;
	return findkth(x - (re[re[t].ls].size + re[t].num), re[t].rs);
}
int myupgrt(int x, int t = root) {
	if (!t) return 0;
	if (re[t].val == x && re[t].num)
		return re[re[t].ls].size;
	else if (re[t].val < x)
		return re[re[t].ls].size + re[t].num + myupgrt(x, re[t].rs);
	return myupgrt(x, re[t].ls);
}
int myupbd(int x, int t = root) {
	if (!t) return 1;
	if (re[t].val == x && re[t].num)
		return re[re[t].ls].size + 1 + re[t].num;
	if (x < re[t].val)
		return myupbd(x, re[t].ls);
	return re[re[t].ls].size + re[t].num + myupbd(x, re[t].rs);
}
int main() {
	init();
	for (int i = 0; i < n; i++) {
		if (opt[i] == 1)
			insert(x[i]);
		if (opt[i] == 2)
			del(x[i]);
		if (opt[i] == 3)
			cout << myupgrt(x[i]) + 1 << endl;
		if (opt[i] == 4)
			cout << findkth(x[i]) << endl;
		if (opt[i] == 5)
			cout << findkth(myupgrt(x[i])) << endl;
		if (opt[i] == 6)
			cout << findkth(myupbd(x[i])) << endl;
	}
}
2024/3/15 10:31
加载中...