社区讨论
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 条回复,欢迎继续交流。
正在加载回复...