41pts求调,悬赏一关
查看原帖
41pts求调,悬赏一关
550933
Tjaweiof楼主2024/5/2 18:29

RT,为什么平衡树能超时?

#include <bits/stdc++.h>
using namespace std;
int dl, dr, tmp, cnt, root, nn;
struct Tjaweiof{
	int l, r, key, priority, sz, num;
}tree[200001];
void getrand(int x, int a){
	cnt++;
	tree[cnt].key = x;
	tree[cnt].priority = rand();
	tree[cnt].num = a;
	tree[cnt].sz = a;
	nn += a;
	return;
}
void pushup(int x){
	tree[x].sz = tree[tree[x].l].sz + tree[tree[x].r].sz + tree[x].num;
	return;
}
void split(int x, int v, int &l, int &r){
	if (!x){
		l = 0;
		r = 0;
		return;
	}
	if (tree[x].key <= v){
		l = x;
		split(tree[x].r, v, tree[x].r, r);
	} else {
		r = x;
		split(tree[x].l, v, l, tree[x].l);
	}
	pushup(x);
	return;
}
int merge(int l, int r){
	if (!l || !r){
		return l + r;
	}
	if (tree[l].priority <= tree[r].priority){
		tree[l].r = merge(tree[l].r, r);
		pushup(l);
		return l;
	} else {
		tree[r].l = merge(l, tree[r].l);
		pushup(r);
		return r;
	}
}
void insert(int x, int a){
	split(root, x - 1, dl, dr);
	getrand(x, a);
	root = merge(dl, merge(cnt, dr));
	return;
}
int getnum(int p, int x){
	int u = tree[tree[p].l].sz + 1, v = tree[tree[p].l].sz + tree[p].num;
	if (u <= x && x <= v){
		return tree[p].key;
	} else if (x < u){
		return getnum(tree[p].l, x);
	} else {
		return getnum(tree[p].r, x - v);
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	srand(time(NULL));
	int n, v, a;
	cin >> n;
	while (n--){
		cin >> v >> a;
		insert(v, a);
		cout << getnum(root, (nn + 1) >> 1) << endl;
	}
	return 0;
}

2024/5/2 18:29
加载中...