【悬赏关注】Treap 65pts求调
查看原帖
【悬赏关注】Treap 65pts求调
999274
CNS_5t0_0r2楼主2023/12/1 13:48
#include<cstdio>
#include<cstdlib>
#include<ctime>
const int N = 1e5 + 9;
int q,op,x,cnt = 1,root = 1;
int read() {
	char c = getchar();
	int x = 0, f = 1;
	while (c < '0' || c > '9')
		c = getchar();
	while (c >= '0' && c <= '9') {
		x = (x << 3) + (x << 1) + c - 48;
		c = getchar();
	}
	return x * f;
}
void write(int x){
    if(x >= 10)
        write(x / 10);
    putchar(x % 10 + 48);
}
void print(int x){
    write(x);
    putchar('\n');
}
struct node{
	int l,r,val,num_val,tree_size,num_cnt;
	node(int _num_val_){
		l = 0;
		r = 0;
		val = rand();
		num_val = _num_val_;
		tree_size = 1;
		num_cnt = 1;
	}
	node(){}
} a[N];
void push_up(int root){
	a[root].tree_size = a[a[root].l].tree_size + a[a[root].r].tree_size + a[root].num_cnt;
}
int x_rank(int x,int root){
	if(root){
		if(x < a[root].num_val)
			return x_rank(x,a[root].l);
		else if(x > a[root].num_val)
			return x_rank(x,a[root].r) + a[a[root].l].tree_size + a[root].num_cnt;
		return a[a[root].l].tree_size + 1;
	}
	return 1;
}
int xth_num(int x,int root){
	if(x <= a[a[root].l].tree_size)
		return xth_num(x,a[root].l);
	else if(x <= a[a[root].l].tree_size + a[root].num_cnt)
		return a[root].num_val;
	return xth_num(x - (a[a[root].l].tree_size + a[root].num_cnt),a[root].r);
}
void zig(int &root){
	int u = a[root].l;
	a[root].l = a[u].r;a[u].r = root;root = u;
	push_up(a[root].r);push_up(root);
}
void zag(int &root){
	int u = a[root].r;
	a[root].r = a[u].l;a[u].l = root;root = u;
	push_up(a[root].l);push_up(root);
}
void insert(int x,int &root){
	if(x < a[root].num_val){
		if(!a[root].l){
			a[root].l = ++cnt;
			a[cnt] = node(x);
		}
		else{
			insert(x,a[root].l);
			if(a[root].val < a[a[root].l].val)
				zig(root);
		}
	}
	else if(x > a[root].num_val){
		if(!a[root].r){
			a[root].r = ++cnt;
			a[cnt] = node(x);
		}
		else{
			insert(x,a[root].r);
			if(a[root].val < a[a[root].r].val)
				zag(root);
		}
	}
	else{
		a[root].num_cnt++;
	}
	push_up(root);
}
void Remove(int x,int &root){
	if(!root)
		return;
	if(x == a[root].num_val){
		if(a[root].num_cnt >= 2){
			a[root].num_cnt--;
			return;
		}
		if(a[root].l || a[root].r){
			if(!a[root].r || a[a[root].l].val > a[a[root].r].val){
				zig(root);
				Remove(x,a[root].r);
			}
			else{
				zag(root);
				Remove(x,a[root].l);
			}
			push_up(root);
		}
		else
			root = 0;
		return;
	}
	if(x < a[root].num_val)
		Remove(x,a[root].l);
	else
		Remove(x,a[root].r);
	push_up(root);
}
int main(){
	//q = read();
	//freopen("P3369_5.in","r",stdin);
	srand(time(0));
	scanf("%d", &q);
	for(int i = 1;i <= q;i++){
		//op = read();x = read();
		scanf("%d%d", &op, &x);
		if(op == 3){
			//print(x_rank(x,root));
			printf("%d\n",x_rank(x,root));
		}
		if(op == 4){
			//print(xth_num(x,root));
			printf("%d\n",xth_num(x,root));
		}
		if(op == 5){
			int tmp = x_rank(x,root);
			//print(xth_num(tmp - 1,root));
			printf("%d\n",xth_num(tmp - 1,root));
		}
		if(op == 6){
			int tmp = x_rank(x + 1,root);
			//print(xth_num(tmp,root));
			printf("%d\n",xth_num(tmp,root));
		}
		if(op == 1)
			insert(x,root);
		if(op == 2)
			Remove(x,root);
	}
	return 0;
}
2023/12/1 13:48
加载中...