堆中的路径

堆中的路径

将一系列给定数字插入一个初始为空的小顶堆 H[] 。随后对任意给定的下标 i ,打印从 H[i] 到根结点的路径。

输入格式:

每组测试第1行包含2个正整数N和M(≤ 1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。

输出格式:

对输入中给出的每个下标 i ,在一行中输出从 H[i] 到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。

输入样例:

5 3
46 23 26 24 10
5 4 3

输出样例:

24 23 10
46 23 10
26 10

 

解题思路

  主要是堆的插入操作。

  AC代码:

 1 #include <cstdio>
 2 
 3 void insert(int *heap, int value, int pos);
 4 void print(int *heap, int pos);
 5 
 6 int main() {
 7     int n, m;
 8     scanf("%d %d", &n, &m);
 9     int heap[n + 1];
10     for (int i = 1; i <= n; i++) {
11         int value;
12         scanf("%d", &value);
13         insert(heap, value, i);
14     }
15     
16     for (int i = 0; i < m; i++) {
17         int pos;
18         scanf("%d", &pos);
19         print(heap, pos);
20     }
21     
22     return 0;
23 }
24 
25 void insert(int *heap, int value, int pos) {
26     int i = pos;
27     for ( ; i > 1 && value < heap[i >> 1]; i >>= 1) {
28         heap[i] = heap[i >> 1];
29     }
30     heap[i] = value;
31 }
32 
33 void print(int *heap, int pos) {
34     for (int i = pos; i >= 1; i >>= 1) {
35         printf("%d", heap[i]);
36         if (i != 1) printf(" ");
37         else printf("\n");
38     }
39 }

posted @ 2021-05-27 22:49  onlyblues  阅读(142)  评论(0编辑  收藏  举报
Web Analytics