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]='\0'; 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]='\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\n",dp[j].s); } } return 0; }