rt,这是一个新鲜的 Treap,然后我发现题目不会有重复的,所以把 num 数组删掉了,然后就错了。
真诚求助大佬帮助!
被注释掉的是错误的,没注释掉的是正确的板子
struct Treap
{
#define ls son[p][0]
#define rs son[p][1]
#define ds son[p][d]
// int siz[N*3],val[N*3],son[N*3][2],rd[N*3];
int tot,siz[N],val[N],num[N],rd[N],son[N][2];
void up(int p){siz[p]=siz[ls]+siz[rs]+num[p];}
void rotate(int &p,int d)
{
int k=son[p][d^1];
son[p][d^1]=son[k][d];son[k][d]=p;
up(p);up(k);p=k;
}
void insert(int &p,int x)
{
if(!p){p=++tot;siz[p]=num[p]=1;val[p]=x;rd[p]=rand();return;}
if(val[p]==x){num[p]++;siz[p]++;return;}
int d=(x>val[p]);
insert(ds,x);
if(rd[p]<rd[ds])rotate(p,d^1);
up(p);
}
void del(int &p,int x)
{
if(!p)return;
if(x==val[p])
{
if(!ls&&!rs){num[p]--;siz[p]--;if(!num[p])p=0;}
else {int d=rd[ls]>rd[rs];rotate(p,d);del(ds,x);}
}
else del(son[p][x>val[p]],x);
up(p);
}
int rnk(int p,int x)
{
if(!p)return 1;
if(x==val[p])return siz[ls]+1;
if(x>val[p])return siz[ls]+num[p]+rnk(rs,x);
if(x<val[p])return rnk(ls,x);
}
/*
void up(int p){siz[p]=siz[ls]+siz[rs]+1;}
void rotate(int &p,int d)
{
int k=son[p][d^1];
son[p][d^1]=son[k][d];son[k][d]=p;
up(p);up(k);p=k;
}
void insert(int &p,int x)
{
if(!p){p=++tot;siz[p]=1;val[p]=x;rd[p]=rand();return;}
// if(val[p]==x)return siz[p]++,void();
int d=(x>val[p]);
insert(ds,x);
if(rd[p]<rd[ds])rotate(p,d^1);
up(p);
}
void del(int &p,int x)
{
if(!p)return;
if(x==val[p])
{
if(!ls&&!rs){siz[p]=0;p=0;}
else {int d=rd[ls]>rd[rs];rotate(p,d);del(ds,x);}
}
else del(son[p][x>val[p]],x);
up(p);
}
int rnk(int p,int x)
{
if(!p)return 1;
if(x==val[p])return siz[ls]+1;
if(x>val[p])return siz[ls]+1+rnk(rs,x);
else return rnk(ls,x);
}
*/
void test(int p)
{
if(!p)return;
test(ls);printf("siz[%d]:%d ",val[p],siz[p]);test(rs);
}
#undef ls
#undef rs
#undef ds
}treap;