求助范浩强
查看原帖
求助范浩强
160839
Prean楼主2020/5/2 12:57

死循环了,求助QwQ

Code:

#include<cstdlib>
#include<cstdio>
#include<ctime>
class fhq_Treap
{
private:
	struct Node
	{
		int L,R,s,val,rnd;
		Node(int val=0):s(1),val(val),rnd(rand()){}
	}t[25000005];
	int cnt,root[500005];
	void undate(int now)
	{
		t[now].s=t[t[now].L].s+t[t[now].R].s+1;
	}
	int merge(int x,int y)
	{
		if(!x||!y)return x+y;
		int p=++cnt;
		if(t[x].rnd>t[y].rnd)t[p]=t[x],t[p].R=merge(t[p].R,y);
		else t[p]=t[y],t[p].L=merge(x,t[p].L);
		undate(p);return p;
	}
	void split(int now,int k,int&x,int&y)
	{
		if(!now)return(void)(x=y=0);
		if(t[now].val<=k)
		{
			t[x=++cnt]=t[now];
			split(t[x].R,k,t[x].R,y);
			undate(x);
		}
		else
		{
			t[y=++cnt]=t[now];
			split(t[y].L,k,x,t[y].L);
			undate(y);
		}
	}
	int kth(int now,int rk)
	{
		while(1)
		{
			if(rk==t[t[now].L].s+1)return now;
			if(rk<=t[t[now].L].s)now=t[now].L;
			else rk-=t[t[now].L].s+1,now=t[now].R;
		}
	}
public:
	void push(int pre,int val)
	{
		int x,y;
		split(root[pre],val,x,y);
		t[++cnt]=Node(val);
		root[pre]=merge(merge(x,cnt),y);
	}
	void pop(int pre,int val)
	{
		int x,y,z;
		split(root[pre],val,x,y);split(x,val-1,x,y);
		root[pre]=merge(merge(x,merge(t[y].L,t[y].R)),z);
	}
	int find(int pre,int val)
	{
		int x,y,ans;
		split(root[pre],val-1,x,y);
		ans=t[x].s+1;root[pre]=merge(x,y);
		return ans;
	}
	int rank(int pre,int k)
	{
		return t[kth(root[pre],k)].val;
	}
	int lower(int pre,int val)
	{
		int x,y,ans;
		split(root[pre],val-1,x,y);
		if(!x)return -2147483647;
		ans=kth(x,t[x].s);root[pre]=merge(x,y);
		return ans;
	}
	int upper(int pre,int val)
	{
		int x,y,ans;
		split(root[pre],val,x,y);
		if(!y)return 2147483647;
		ans=kth(y,1);root[pre]=merge(x,y);
		return ans;
	}
}BST;
signed main()
{
	srand((unsigned)time(0));
	int n,v,x,opt;scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d%d",&v,&opt,&x);
		if(opt==1)BST.push(v,x);
		if(opt==2)BST.pop(v,x);
		if(opt==3)printf("%d\n",BST.find(v,x));
		if(opt==4)printf("%d\n",BST.rank(v,x));
		if(opt==5)printf("%d\n",BST.lower(v,x));
		if(opt==6)printf("%d\n",BST.upper(v,x));
	}
}
2020/5/2 12:57
加载中...