社区讨论

treapWA40分求助

P3369【模板】普通平衡树参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi6nn1qi
此快照首次捕获于
2025/11/20 07:49
4 个月前
此快照最后确认于
2025/11/20 07:49
4 个月前
查看原帖
如题。
CPP
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define root tree[0]
using namespace std;
struct node{
	int val,siz,num,pri;
	node *ch[2];
	node(int x){
		val=x;
		siz=num=1;
		pri=rand();
		ch[0]=ch[1]=NULL;
	}
	int cmp(int x){
		if(x<val)
			return 0;
		if(x==val)
			return -1;
		return 1;
	}
	void maintain(){
		siz=num;
		if(ch[0]!=NULL)
			siz+=ch[0]->siz;
		if(ch[1]!=NULL)
			siz+=ch[1]->siz;
	}
};
node *tree[100010];
int n,tot;
node *newnode(int x){
	tree[tot]=new node(x);
	return tree[tot++];
}
void rotate(node *&o,int d){
	node *p=o->ch[d^1];
	o->ch[d^1]=p->ch[d];
	p->ch[d]=o;
	o->maintain();
	p->maintain();
	o=p;
}
void insert(node *&o,int x){
	if(o==NULL){
		o=newnode(x);
		return;
	}
	o->siz++;
	int d=o->cmp(x);
	if(d==-1){
		o->num++;
		return;
	}
	insert(o->ch[d],x);
	if(o->ch[d]->pri>o->pri)
		rotate(o,d^1);
}
int remove(node *&o,int x){
	if(o==NULL)
		return 0;
	int d=o->cmp(x);
	if(d==-1){
		if(!o->num)
			return 0; 
		o->num--;
		o->siz--;
		return 1;
	}
	int k=remove(o->ch[d],x);
	o->siz-=k;
	return k;
}
int rnk(node *&o,int x){
	if(o==NULL)
		return 1;
	int d=o->cmp(x);
	if(d==-1){
		if(o->ch[0]!=NULL)
			return o->ch[0]->siz+1;
		return 1;
	}
	if(!d)
		return rnk(o->ch[0],x);
	if(o->ch[0]!=NULL)
		return o->ch[0]->siz+o->num+rnk(o->ch[1],x);
	return o->num+rnk(o->ch[1],x);
}
int kth(node *&o,int x){
	if(o==NULL)
		return 0;
	if(o->ch[0]!=NULL){
		if(x<=o->ch[0]->siz)
			return kth(o->ch[0],x);
		if(x<=o->ch[0]->siz+o->num)
			return o->val;
		return kth(o->ch[1],x-o->ch[0]->siz-o->num);
	}
	if(x<=o->num)
		return o->val;
	return kth(o->ch[1],x-o->num);
}
int qlast(node *&o,int x,int now){
	if(o==NULL)
		return now;
	if(o->val<x)
		return qlast(o->ch[1],x,o->val);
	return qlast(o->ch[0],x,now);
}
int qnxt(node *&o,int x,int now){
	if(o==NULL)
		return now;
	if(o->val>x)
		return qnxt(o->ch[0],x,o->val);
	return qnxt(o->ch[1],x,now);
}
int main(){
	memset(tree,NULL,sizeof(tree));
	scanf("%d",&n);
	while(n--){
		int opt,x;
		scanf("%d%d",&opt,&x);
		if(opt==1)
			insert(root,x);
		if(opt==2)
			remove(root,x);
		if(opt==3)
			printf("%d\n",rnk(root,x));
		if(opt==4)
			printf("%d\n",kth(root,x));
		if(opt==5)
			printf("%d\n",qlast(root,x,0));
		if(opt==6)
			printf("%d\n",qnxt(root,x,0));
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...