hdu 5444 Elven Postman长春网赛

5444 2333

建二插排序树,dfs一遍,之后o(1)应对查询

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1008;
struct fuck{
	int left,right;
}poi[maxn];
int tol;
struct shit{
	char s[maxn];
	int idx;
}dp[maxn];
void dfs(int u,int x)
{
	if(x<u&&poi[u].left==-1)
	{
		poi[u].left=x;
		poi[x].left=-1;
		poi[x].right=-1;
		return;
	}
	if(x>u&&poi[u].right==-1)
	{
		poi[u].right=x;
		poi[x].left=-1;
		poi[x].right=-1;
		return;
	}
	if(x<u)	dfs(poi[u].left,x);
	if(x>u)	dfs(poi[u].right,x);
}
void fuckdfs(int u,bool flag,int fa)
{
	strcpy(dp[u].s,dp[fa].s);
	if(flag==true)
	dp[u].s[dp[fa].idx]='E';
	else
	dp[u].s[dp[fa].idx]='W';
	dp[u].idx=dp[fa].idx+1;
	dp[u].s[dp[u].idx]='';
	if(poi[u].left!=-1)
	fuckdfs(poi[u].left,true,u);
	if(poi[u].right!=-1)
	fuckdfs(poi[u].right,false,u);
}
int main()
{
	int i,j,n,m,t,x;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		scanf("%d",&x);
		int root=x;
		poi[root].left=-1;poi[root].right=-1;
		dp[root].s[0]='';dp[root].idx=0;
		for(i=2;i<=n;i++)
		{
			scanf("%d",&x);
			dfs(root,x); 
		}
		if(poi[root].left!=-1)
		fuckdfs(poi[root].left,true,root);
		if(poi[root].right!=-1)
		fuckdfs(poi[root].right,false,root);
		scanf("%d",&x);
		while(x--)
		{
			scanf("%d",&j);
			printf("%s
",dp[j].s);
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/bitch1319453/p/4805511.html