萌新求救:treap在linux和window下输出不同的结果
查看原帖
萌新求救:treap在linux和window下输出不同的结果
124703
zlh123楼主2020/6/19 19:52
#include<cstdio>
#include<cstdlib>
using namespace std;
struct node
{
	int l,r,val,pri,cnt,size;
}a[100001];
int root=0,cnt;
void Update(int k)
{
	a[k].size=a[a[k].l].size+a[a[k].r].size+a[k].cnt;
}
void Zig(int &k)
{
	int y=a[k].l;
	a[k].l=a[y].r;
	a[y].r=k;
	a[y].size=a[k].size;
	Update(k);
	k=y;
}
void Zag(int &k)
{
	int y=a[k].r;
	a[k].r=a[y].l;
	a[y].l=k;
	a[y].size=a[k].size;
	Update(k);
	k=y;
}
void Insert(int &k,int v)
{
	if(!k)
	{
		k=++cnt;
		a[k].l=a[k].r=0;
		a[k].val=v;
		a[k].pri=rand();
		a[k].size=1;
		a[k].cnt=1;
		return;
	}
	a[k].size++;
	if(v==a[k].val)
	{
		a[k].cnt++;
		return;
	}
	if(v<a[k].val)
	{
		Insert(a[k].l,v);
		if(a[a[k].l].pri<a[k].pri) Zig(k);
		return;
	}
	if(v>a[k].val)
	{
		Insert(a[k].r,v);
		if(a[a[k].r].pri<a[k].pri) Zag(k);
		return;
	}
}
void Delete(int &k,int v)
{
	a[k].size--;
	if(v==a[k].val)
	{
		if(a[k].cnt==1)
		{
			if(!a[k].l||!a[k].r) k=a[k].l+a[k].r;
			else
			{
				if(a[a[k].l].pri<a[a[k].r].pri)
					Zig(k),Delete(a[k].r,v);
				else
					Zag(k),Delete(a[k].l,v);
			}
			return;
		}
	}
	if(v<a[k].val)
	{
		Delete(a[k].l,v);
		return;
	}
	if(v>a[k].val)
	{
		Delete(a[k].r,v);
		return;
	}
}
int Query(int k,int v)
{
	if(a[k].val<v) return a[k].size+a[a[k].l].size+Query(a[k].r,v);
	if(a[k].val>v) return Query(a[k].l,v);
	return a[a[k].l].size+1;
}
int Rank(int k,int x)
{
	if(x>a[a[k].l].size&&x<=a[a[k].l].size+a[k].cnt) return a[k].val;
	if(a[a[k].l].size>=x) return Rank(a[k].l,x);
	return Rank(a[k].r,x-a[a[k].l].size-a[k].cnt);
}
int Prede(int k,int v)
{
	if(!k) return 0;
	if(a[k].val<v)
	{
		int tmp=Prede(a[k].r,v);
		return tmp?tmp:a[k].val;
	}
	return Prede(a[k].l,v);
}
int Suc(int k,int v)
{
	if(!k) return 0;
	if(a[k].val>v)
	{
		int tmp=Suc(a[k].l,v);
		return tmp?tmp:a[k].val;
	}
	return Prede(a[k].r,v);
}
int main()
{
	int n,opt,x;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&opt,&x);
		switch(opt)
		{
			case 1:
				Insert(root,x);
				break;
			case 2:
				Delete(root,x);
				break;
			case 3:
				printf("%d\n",Query(root,x));
				break;
			case 4:
				printf("%d\n",Rank(root,x));
				break;
			case 5:
				printf("%d\n",Prede(root,x));
				break;
			case 6:
				printf("%d\n",Suc(root,x));
				break;
		}
	}
	return 0;
}

两个猜想
1.有些变量没有赋初值
2.linux下rand函数输出爆int
明天就省选了,救救蒟蒻!

2020/6/19 19:52
加载中...