hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online

很坑的一道题,读了半天才读懂题,手忙脚乱的写完(套上模板+修改模板),然后RE到死……

题意:

题面上告诉了我们这是一棵二叉树,然后告诉了我们它的先序遍历,然后,没了……没了!

反复读题,终于在偶然间注意到了这一句——"Not only that, when numbering the rooms, they always number the room number from the east-most position to the west."

它告诉我们,东边的点总是比西边的点小——也就是说,这个树的中序遍历是从1到n的一个等差数列……

输入:

首行输入一个整数t,表示有t组数据;

接下来每组数据首行一个整数n,表示有这棵树有n个节点。

接下来一行有n个整数,表示这棵树的先序遍历。

接下来一行一个整数m,表示m次查询。

接下来一行有m个整数,表示每次查询的点。

输出:

每次查询输出从根节点到查询节点的路径,路径中,每次向左输出‘E‘,每次向右输出‘W‘。

解题思路:

套上模板,建立起这棵树,同时用一个fm[]数组讲每个节点的父节点记录下来。然后查询的时候使用就行了。

但是有两点需要注意:

1. 由于我是使用指针建立的树,所以每用完一组数据都要记得释放内存!

2. 每次第二组数据的根节点也许在第一组数据中不是根节点,所以要记得将根节点的父节点fm[root]置为0。我的现场赛名额啊……因此离我而去T_T,555555……

不说了,说多了都是泪。。。。。

上代码——

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 struct Node
 9 {
10     int c;
11     Node *left;
12     Node *right;
13 };
14
15 int fm[1010];
16 int t, n, m;
17 char dis[1010];
18 int pree[1010],ine[1010];
19
20 Node* BuildTree(int *pre, int *in, int length)      //建树
21 {
22     if(length == 0) return NULL;
23     Node* node = (Node*) malloc(sizeof(Node));
24     node->c = pre[0];
25     int rootindex = -1;
26     for(int i = 0;i < length;i++)
27     {
28         if(in[i] == pre[0])
29         {
30             rootindex = i;
31             break;
32         }
33     }
34     node->left = BuildTree(pre+1,in,rootindex);//left
35     node->right = BuildTree(pre+1+rootindex,in+rootindex+1,length-rootindex-1);//right
36     return node;
37 }
38
39 void print(Node *root)          //记录父节点
40 {
41     if(root != NULL)
42     {
43         if(root->left != NULL) fm[root->left->c] = (root->c)*10;
44         print(root->left);
45         if(root->right != NULL) fm[root->right->c] = (root->c)*10+1;
46         print(root->right);
47     }
48 }
49
50 void dfs(Node* root)            //释放内存
51 {
52     if(root != NULL)
53     {
54         if(root->left != NULL) dfs(root->left);
55         if(root->right != NULL) dfs(root->right);
56         free(root);
57     }
58 }
59
60 int main()
61 {
62     //freopen("test.in", "r", stdin);
63     scanf("%d", &t);
64     while(t--)
65     {
66         scanf("%d", &n);
67         for(int i = 0; i < n; i++)
68         {
69             scanf("%d", &pree[i]);
70             ine[i] = i+1;
71         }
72         Node *root = BuildTree(pree, ine, n) ;
73         fm[root->c] = 0;                //就是这里,坑死我了……我@#¥%^&*!
74         print(root);
75         scanf("%d",&m);
76         for(int i = 0; i < m; i++)
77         {
78             int mid;
79             scanf("%d", &mid);
80             int k = 0;
81             while(fm[mid] != 0)
82             {
83                 if(fm[mid]%10 == 1) dis[k] = ‘W‘;
84                 else dis[k] = ‘E‘;
85                 mid = fm[mid]/10;
86                 k++;
87             }
88             for(int j = k-1; j >=0; j--) printf("%c", dis[j]);      //输出路径
89             printf("\n");
90         }
91         dfs(root);
92     }
93     return 0;
94 }

时间: 2024-12-28 17:19:38

hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online的相关文章

2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】

Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 591    Accepted Submission(s): 329 Problem Description Elves are very peculiar creatures. As we all know, they can live for a very

(并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )

http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2061    Accepted Submission(s): 711 Problem Description Jack likes to travel around the wo

HDU 5444 Elven Postman (2015 ACM/ICPC Asia Regional Changchun Online)

[题目链接]:click here~~ [题目大意]: HDU 5444 题意:在最初为空的二叉树中不断的插入n个数.对于每个数,从根节点开始判断,如果当前节点为空,就插入当前节点,如果当前节点不为空,则小于当前节点的值,插入右子树,否则插入左子树. 接着q次询问,每次询问一个值在二叉树中从根节点开始的查找路径. 3 直接用二叉树模拟整个插入和询问的过程 代码: /* * Problem: HDU No.5444 * Running time: 0MS * Complier: G++ * Aut

2015 ACM/ICPC Asia Regional Changchun Online Pro 1008 Elven Postman

Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Elves are very peculiar creatures. As we all know, they can live for a very lon

HDU 5438 Ponds (拓扑排序+DFS)2015 ACM/ICPC Asia Regional Changchun Online

[题目链接]:click here~~ [题目大意]: 题意:在一个无向图中有 p 个点, m 条边,每个点有一个值 vi .不断的删去度数小于2的点直到不能删为止.求新图中所有点个数为奇数的连通分量的点值的和. 1<p<10^4,1<m<10^5 [思路]删边考虑类似拓扑排序的写法,不过topsort是循环一遍1到n结点入度为0的结点,然后加入到队列中,这里只要改一下度数小于等于1,最后DFS 判断一下 挫挫的代码: /* * Problem: HDU No.5438 * Run

Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)

题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果顺时针和逆时针的起始下标相同,则输出顺时针. 解题思路: 看到题目感觉后缀数组可以搞,正准备犯傻被队友拦下了,听队友解释一番,果断丢锅给队友.赛后试了一下后缀数组果然麻烦的不要不要的(QWQ),还是最大最小表示法 + KMP来的干净利索. 最大表示法:对于一个长度为len文本串,经过循环旋转得到长度

(线段树 区间查询)The Water Problem -- hdu -- 5443 (2015 ACM/ICPC Asia Regional Changchun Online)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=5443 The Water Problem Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 738    Accepted Submission(s): 591 Problem Description In Land waterless, w

2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v)满足两点之间每一条边都不超过x,问有多少对 思路:首先我想到的是dfs求出每个查询小于等于他的一个连通块,然后num*(num-1)就是答案,但是时间只有一秒,这个复杂度是5*1e8,超时了(亲身体验了) 然后我们想这个是离线的,我们可不可以由小到大来推,这样前面的贡献到后面就依然能用了,但是我们

【二分】【最长上升子序列】HDU 5489 Removed Interval (2015 ACM/ICPC Asia Regional Hefei Online)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5489 题目大意: 一个N(N<=100000)个数的序列,要从中去掉相邻的L个数(去掉整个区间),使得剩余的数最长上升子序列(LIS)最长. 题目思路: [二分][最长上升子序列] 首先,假设去掉[i,i+m-1]这L个数,剩余的LIS长度为max(i左端最后一个不大于a[i+m]的LIS长度+a[i+m]开始到最后的LIS长度). 所以,我们从n到1逆向先求最长下降子序列的长度f[i],就可以知