求条悬3关51pts wa on test7-13
查看原帖
求条悬3关51pts wa on test7-13
1051983
bo_od楼主2024/12/12 18:59

似乎是find的问题。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
struct bst {
	int l;
	int r;
	int val;
	int cnt;
	int size;
	int data;
};
int n, a, op, cnt, root;
bst tree[100009];
void height(int& x) {
	tree[x].size = tree[tree[x].l].size + tree[tree[x].r].size + tree[x].cnt;
	return;
}
void zig(int& x) {
	int y = tree[x].l;
	tree[x].l = tree[y].r;
	tree[y].r = x;
	height(x);
	height(y);
	x = y;
	return;
}
void zag(int& x) {
	int y = tree[x].r;
	tree[x].r = tree[y].l;
	tree[y].l = x;
	height(x);
	height(y);
	x = y;
	return;
}
int rnk(int val, int x) {
	if(x == 0 || tree[x].val == val)
		return tree[tree[x].l].size + 1;
	else if(tree[x].val < val)
		return tree[tree[x].l].size + tree[x].cnt + rnk(val, tree[x].r);
	else
		return rnk(val, tree[x].l);
}
int find(int val, int x) {
	if(val <= tree[tree[x].l].size)
		return find(val, tree[x].l);
	else if(val == tree[tree[x].l].size + 1)
		return tree[x].val;
	else
		return find(val - tree[tree[x].l].size - 1, tree[x].r);
}
int next(int val, int x) {
	if(x == 0)
		return inf;
	else if(tree[x].val > val)
		return min(tree[x].val, next(val, tree[x].l));
	else if(tree[x].val == val) {
		int ans = inf;
		x = tree[x].r;
		while(x) {
			ans = tree[x].val;
			x = tree[x].r;
		}
		return ans;
	}
	else
		return next(val, tree[x].r);
}
int last(int val, int x) {
	if(x == 0)
		return -inf;
	else if(tree[x].val > val)
		return last(val, tree[x].l);
	else if(tree[x].val == val) {
		int ans = -inf;
		x = tree[x].l;
		while(x) {
			ans = tree[x].val;
			x = tree[x].r;
		}
		return ans;
	}
	else
		return max(tree[x].val, last(val, tree[x].r));
}
void insert(int val, int& x) {
	if(x == 0) {
		cnt++;
		x = cnt;
		tree[cnt].size = 1;
		tree[cnt].val = val;
		tree[cnt].cnt = 1;
		tree[cnt].data = rand();
		return;
	}
	tree[x].size++;
	if(tree[x].val == val)
		tree[x].cnt++;
	else if(tree[x].val < val) {
		insert(val, tree[x].r);
		if(tree[tree[x].r].data < tree[x].data)
			zag(x);
	}
	else {
		insert(val, tree[x].l);
		if(tree[tree[x].l].data < tree[x].data)
			zig(x);
	}
}
void erase(int val, int& x) {
	tree[x].size--;
	if(tree[x].val == val) {
		if(tree[x].cnt > 1)
			tree[x].cnt--;
		else if(tree[x].l && !tree[x].r) {
			zig(x);
			erase(val, tree[x].r);
		}
		else if(!tree[x].l && tree[x].r) {
			zag(x);
			erase(val, tree[x].l);
		}
		else if(!tree[x].l && !tree[x].r)
			x = 0;
		else if(tree[tree[x].l].data > tree[tree[x].r].data) {
			zag(x);
			erase(val, tree[x].l);
		}
		else {
			zig(x);
			erase(val, tree[x].r);
		}
	}
	else if(tree[x].val < val)
		erase(val, tree[x].r);
	else
		erase(val, tree[x].l);
}
void print(int x) {
	if(tree[x].l)
		print(tree[x].l);
	for(int i = 1; i <= tree[x].cnt; i++)
		printf("%d ", tree[x].val);
	if(tree[x].r)
		print(tree[x].r);
	return;
}
int main() {
	//freopen("P3369_7.in","r",stdin); 
	//freopen("P3369_7.txt","w",stdout); 
	srand(time(0));
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) {
		scanf("%d %d", &op, &a);
		if(op == 1)
			insert(a, root);
		else if(op == 2)
			erase(a, root);
		else if(op == 3)
			printf("%d\n", rnk(a, root));
		else if(op == 4)
			printf("%d\n", find(a, root));
		else if(op == 5)
			printf("%d\n", last(a, root));
		else
			printf("%d\n", next(a, root));
	}
	return 0;
}
2024/12/12 18:59
加载中...