堆中的路径

堆中的路径

将一系列给定数字插入一个初始为空的小顶堆 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 @   onlyblues  阅读(161)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
Web Analytics
点击右上角即可分享
微信分享提示