萌新求助,全WA
查看原帖
萌新求助,全WA
315191
P31pr楼主2020/11/29 21:53

RT,并不知道哪里出错了,调了两天了(从TLE变WA)/kk/kk

朴素的二叉查找树:

#include<cstdio>
#define IL inline
const int MAXN=1e5,INF=2147483647;
int n,op,x;

IL int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x*10)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

struct BinarySearchTree
{
	int fa,lson,rson;
	bool left;
	int lsize,rsize;
	int val,cnt;
}a[MAXN+5];
int p;
IL void insert(int x)
{
	if(!p)
	{
		a[++p].val=x;
		a[p].cnt=1;
		return;
	}
	int cur=1,fa=0;
	bool less;
	while(cur)
	{
		if(x==a[cur].val)
		{
			a[cur].cnt++;
			if(a[cur].left)
				a[a[cur].fa].lsize++;
			else a[a[cur].fa].rsize++;
			return;
		}
		if(x<a[cur].val)
		{
			less=true;
			a[cur].lsize++;
			fa=cur;
			cur=a[cur].lson;
		}
		else
		{
			less=false;
			a[cur].rsize++;
			fa=cur;
			cur=a[cur].rson;
		}
	}
	a[++p].fa=fa;
	a[p].val=x;
	a[p].cnt=1;
	if(less) 
	{
		a[fa].lson=p;
		a[p].left=true;
	}
	else 
	{
		a[fa].rson=p;
		a[p].left=false;
	}
}
IL int rankof(int x)
{
	int cur=1,rk=1;
	while(a[cur].val!=x&&cur)
		if(x>a[cur].val)
		{
			rk+=a[cur].lsize+a[cur].cnt;
			cur=a[cur].rson;
		}
		else cur=a[cur].lson;
	if(!cur) return 0;
	return rk;
}
IL int getrking(int x)
{
	--x;
	int cur=1,rk=0;
	while(rk!=x)
		if(x>=a[cur].lsize+a[cur].cnt+rk)
		{
			rk+=a[cur].lsize+a[cur].cnt;
			cur=a[cur].rson;
		}
		else if(x>=a[cur].lsize+rk) return a[cur].val;
		else cur=a[cur].lson;
	//if(!cur) return INF;
	return a[cur].val;
}
IL int pre(int x)
{
	int cur=1,res=-INF;
	while(cur)
	{
		if(a[cur].val<x)
		{
			res=a[cur].val;
			cur=a[cur].rson;
		}
		else cur=a[cur].lson;
	}
	return res;
}
IL int post(int x)
{
	int cur=1,res=INF;
	while(cur)
	{
		if(a[cur].val>x)
		{
			res=a[cur].val;
			cur=a[cur].lson;
		}
		else cur=a[cur].rson;
	}
	return res;
}

int main()
{
	n=read();
	for(int i=1;i<=n;++i)
	{
		op=read();x=read();
		switch(op)
		{
			case 1:
				printf("%d\n",rankof(x));
				break;
			case 2:
				printf("%d\n",getrking(x));
				break;
			case 3:
				printf("%d\n",pre(x));
				break;
			case 4:
				printf("%d\n",post(x));
				break;
			case 5:
				insert(x);
				break;
		}
	}
	return 0;
}
2020/11/29 21:53
加载中...