灵异事件
查看原帖
灵异事件
298549
SIXIANG32楼主2020/8/3 10:49

这是我过不了样例的AC代码

#include<iostream>
#define INF 2147483647
using namespace std;
struct node{
	int ls,rs,val;
	int size,rank,cnt;
}tree[100000];
int siz=0;
void insert_a_node(int x,int v)
{
	tree[x].size++;
	//cout<<x<<' '<<v<<' '<<tree[x].val<<endl;
	if(tree[x].val==v)
	{
		tree[x].cnt++;
		return ;
	}
	else
		if(tree[x].val>v)
			if(tree[x].ls!=0)
				insert_a_node(tree[x].ls,v);
			else
				siz++,tree[x].ls=siz,tree[siz].val=v,tree[siz].val=v,tree[siz].size=1,tree[siz].cnt=1;
		else
		if(tree[x].val<v)
			if(tree[x].rs!=0)
				insert_a_node(tree[x].rs,v);
			else
				siz++,tree[x].rs=siz,tree[siz].val=v,tree[siz].val=v,tree[siz].size=1,tree[siz].cnt=1;
}
int find_front_val(int x,int val,int ans)
{
	if(tree[x].val>=val)
		if(!tree[x].ls)
			return ans;
		else
			find_front_val(tree[x].ls,val,ans);
	else
		if(!tree[x].rs)
			return ((tree[x].val<val)?(tree[x].val):(ans));
		else
			if(tree[x].cnt!=0)
				find_front_val(tree[x].rs,val,tree[x].val);
			else
				find_front_val(tree[x].rs,val,ans);
}
int find_back_val(int x,int val,int ans)
{
	if(tree[x].val<=val)
		if(!tree[x].rs)
			return ans;
		else
			find_back_val(tree[x].rs,val,ans);
	else
		if(!tree[x].ls)
			return ((tree[x].val>val)?(tree[x].val):(ans));
		else
			if(tree[x].cnt!=0)
				find_back_val(tree[x].ls,val,tree[x].val);
			else
				find_back_val(tree[x].ls,val,ans);
}
int find_val_rank(int x,int val)
{
	if(x==0)return 0;
	else if(val==tree[x].val)return tree[tree[x].ls].size+1;
	else if(val<tree[x].val)return find_val_rank(tree[x].ls,val);
	return find_val_rank(tree[x].rs,val)+tree[tree[x].ls].size+tree[x].cnt;
}
int find_rank_val(int x,int rank)
{
	if(x==0)return 0;
	else if(tree[tree[x].ls].size>=rank)return find_rank_val(tree[x].ls,rank);
	else if(tree[tree[x].ls].size+tree[x].cnt>=rank)return tree[x].val;
	return find_rank_val(tree[x].rs,rank-tree[tree[x].ls].size-tree[x].cnt);
}
int main()
{
	int n;
	cin>>n;
	for(int p=1,cao,x;p<=n;p++)
	{
		cin>>cao>>x;
		if(cao==1)cout<<find_val_rank(1,x)+1<<endl;
		else if(cao==2)cout<<find_rank_val(1,x)<<endl;
		else if(cao==3)cout<<find_front_val(1,x,-INF)<<endl;
		else if(cao==4)cout<<find_back_val(1,x,INF)<<endl;
		else if(siz==0)tree[1].val=x,tree[1].size=tree[1].cnt=1,siz++;else insert_a_node(1,x);
	}
}

这是我过了样例的保龄代码

#include<iostream>
#define INF 2147483647
using namespace std;
struct node{
	int ls,rs,val;
	int size,rank,cnt;
}tree[100000];
int siz=0;
void insert_a_node(int x,int v)
{
	tree[x].size++;
	//cout<<x<<' '<<v<<' '<<tree[x].val<<endl;
	if(tree[x].val==v)
	{
		tree[x].cnt++;
		return ;
	}
	else
		if(tree[x].val>v)
			if(tree[x].ls!=0)
				insert_a_node(tree[x].ls,v);
			else
				siz++,tree[x].ls=siz,tree[siz].val=v,tree[siz].val=v,tree[siz].size=1,tree[siz].cnt=1;
		else
		if(tree[x].val<v)
			if(tree[x].rs!=0)
				insert_a_node(tree[x].rs,v);
			else
				siz++,tree[x].rs=siz,tree[siz].val=v,tree[siz].val=v,tree[siz].size=1,tree[siz].cnt=1;
}
int find_front_val(int x,int val,int ans)
{
	if(tree[x].val>=val)
		if(!tree[x].ls)
			return ans;
		else
			find_front_val(tree[x].ls,val,ans);
	else
		if(!tree[x].rs)
			return ((tree[x].val<val)?(tree[x].val):(ans));
		else
			if(tree[x].cnt!=0)
				find_front_val(tree[x].rs,val,tree[x].val);
			else
				find_front_val(tree[x].rs,val,ans);
}
int find_back_val(int x,int val,int ans)
{
	if(tree[x].val<=val)
		if(!tree[x].rs)
			return ans;
		else
			find_back_val(tree[x].rs,val,ans);
	else
		if(!tree[x].ls)
			return ((tree[x].val>val)?(tree[x].val):(ans));
		else
			if(tree[x].cnt!=0)
				find_back_val(tree[x].ls,val,tree[x].val);
			else
				find_back_val(tree[x].ls,val,ans);
}
int find_val_rank(int x,int val)
{
	if(x==0)return 0;
	else if(val==tree[x].val)return tree[tree[x].ls].size+1;
	else if(val<tree[x].val)return find_val_rank(tree[x].ls,val);
	return find_val_rank(tree[x].rs,val)+tree[tree[x].ls].size+tree[x].cnt;
}
int find_rank_val(int x,int rank)
{
	if(x==0)return 0;
	else if(tree[tree[x].ls].size>=rank)return find_rank_val(tree[x].ls,rank);
	else if(tree[tree[x].ls].size+tree[x].cnt>=rank)return tree[x].val;
	return find_rank_val(tree[x].rs,rank-tree[tree[x].ls].size-tree[x].cnt);
}
int main()
{
	int n;
	cin>>n;
	for(int p=1,cao,x;p<=n;p++)
	{
		cin>>cao>>x;
		if(cao==1)cout<<find_val_rank(1,x)<<endl;//没有+1
		else if(cao==2)cout<<find_rank_val(1,x)<<endl;
		else if(cao==3)cout<<find_front_val(1,x,-INF)<<endl;
		else if(cao==4)cout<<find_back_val(1,x,INF)<<endl;
		else if(siz==0)tree[1].val=x,tree[1].size=tree[1].cnt=1,siz++;else insert_a_node(1,x);
	}
}

这里是查找排名时操作应该+1的,但是样例没有+1啊qwq
这是灵异事件吗?qwq

2020/8/3 10:49
加载中...