#include <stdio.h>
#include <stdlib.h>
struct Treap
{
Treap *Lson,*Rson;
int val,key,cnt,size;
Treap(int num)
{
Lson = Rson = NULL;
val = num;
key = rand();
cnt = size = 1;
}
void push_up()
{
size = cnt;
if(Lson) size += Lson->size;
if(Rson) size += Rson->size;
}
friend void zig(Treap *&A)//左旋
{
Treap *B = A -> Lson;
A -> Lson = B -> Rson;
B -> Rson = A;
A = B;
A->Rson->push_up();
A->push_up();
}
friend void zag(Treap *&A)//右旋
{
Treap *B = A -> Rson;
A -> Rson = B -> Lson;
B -> Lson = A;
A = B;
A->Lson->push_up();
A->push_up();
}
friend void insert(Treap *&rt,int num)
{
if(rt == NULL)
{
rt = new Treap(num);
return ;
}
else if(num == rt->val)
{
rt->cnt++;
}
else if(num < rt->val)
{
insert(rt->Lson,num);
if(rt->Lson->key > rt->key)
zig(rt);
}
else
{
insert(rt->Rson,num);
if(rt->Rson->key > rt->key)
zag(rt);
}
if(rt) rt -> push_up();
}
friend void delete_num(Treap *&rt,int num)
{
if(rt == NULL)
return ;
else if(num < rt->val)
delete_num(rt->Lson,num);
else if(num > rt->val)
delete_num(rt->Rson,num);
else
{
if(rt->cnt > 1)
rt->cnt--;
else if(rt->Lson == NULL)
rt = rt->Rson;
else if(rt->Rson == NULL)
rt = rt->Lson;
else
{
if(rt->Lson->key > rt->Rson->key)
{
zag(rt);
delete_num(rt->Lson,num);
}
else
{
zig(rt);
delete_num(rt->Rson,num);
}
}
}
if(rt) rt->push_up();
}
friend int search_rank(Treap *rt,int num)
{
if(rt==NULL)
return 0;
int Lsize = (rt->Lson ? rt->Lson->size : 0);
if(rt->val == num)
return Lsize+1;
else if(rt->val < num)
return Lsize + rt->cnt + search_rank(rt->Rson,num);
else
return search_rank(rt->Lson,num);
}
friend int search_num(Treap *rt,int rank)
{
if(rt == NULL)
return 0;
int Lsize = (rt->Lson ? rt->Lson->size : 0);
if(Lsize >= rank)
return search_num(rt->Lson,rank);
else if(Lsize+rt->cnt < rank)
return search_num(rt->Rson,rank-Lsize-rt->cnt);
else
return rt->val;
}
friend void search_pre(Treap *rt,int num,Treap *&p)
{
if(rt == NULL)
return ;
else if(rt->val < num)
{
p = rt;
search_pre(rt->Rson,num,p);
}
else search_pre(rt->Lson,num,p);
}
friend void search_suc(Treap *rt,int num,Treap *&p)
{
if(rt == NULL)
return ;
else if(rt->val > num)
{
p = rt;
search_suc(rt->Lson,num,p);
}
else search_suc(rt->Rson,num,p);
}
}*rt,*ans;
int n,opt,x;
int main()
{
srand(20000620);
rand();
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&opt,&x);
if(opt == 1)
insert(rt,x);
if(opt == 2)
delete_num(rt,x);
if(opt == 3)
printf("%d\n",search_rank(rt,x));
if(opt == 4)
printf("%d\n",search_num(rt,x));
if(opt == 5)
{
ans = NULL;
search_pre(rt,x,ans);
printf("%d\n",ans->val);
}
if(opt == 6)
{
ans = NULL;
search_suc(rt,x,ans);
printf("%d\n",ans->val);
}
}
return 0;
}
[ 模板 ] Treap指针版
最新推荐文章于 2022-08-29 21:14:26 发布