标签:
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1091 Accepted Submission(s): 617

题解:精灵族住在一颗倒着的二叉树上,这棵二叉树是从东到西编号,最东边是1,依次类推,邮递员要给精灵送信,每次邮递员都在最底下的点上,让输出邮递员的路径,思想就是建一颗倒着的二叉树,如果编号小就在东边建,也就是右边,大了就建在左边,每次建图直接把路径存上就妥了;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
const int MAXN=1010;
vector<char>path[MAXN];
struct Node{
Node *L,*R;
int nu;
Node(int x=0):nu(x){
L=NULL;R=NULL;
}
}*rot;
void inst(int x){
Node *p=rot;
while(1){
if(x>p->nu){
path[x].push_back(‘W‘);
if(p->L==NULL){
p->L=new Node(x);
break;
}
else p=p->L;
}
else{
path[x].push_back(‘E‘);
if(p->R==NULL){
p->R=new Node(x);
break;
}
else p=p->R;
}
}
}
int main(){
int T,n,q;
scanf("%d",&T);
while(T--){
for(int i=0;i<MAXN;i++)path[i].clear();
scanf("%d",&n);
int x;
scanf("%d",&x);
rot=new Node(x);
for(int i=1;i<n;i++){
scanf("%d",&x);
inst(x);
}
scanf("%d",&q);
while(q--){
scanf("%d",&x);
for(int i=0;i<path[x].size();i++)
printf("%c",path[x][i]);
puts("");
}
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4978942.html