求助!!!
  • 板块学术版
  • 楼主yanyan2
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/2/28 10:31
  • 上次更新2024/2/28 15:59:05
查看原帖
求助!!!
1087963
yanyan2楼主2024/2/28 10:31

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;
2024/2/28 10:31
加载中...