将一系列给定数字插入一个初始为空的小顶堆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
这道题使用数组,建立一个小顶堆,然后按照题意插入元素即可。
样例数据的堆长这个样子:
代码如下:
#include <iostream>
#include <cstdlib>
#include <algorithm>
using namespace std;
int H[1001] = {-99999}, H_size, query_cnt;
void H_Insert(int n, int index){
H[index] = n;
for(int i = index; H[i/2] > H[i]; i /= 2){
swap(H[i/2], H[i]);
}
}
void print(int n){
cout << H[n];
for(int i = n/2; i > 0; i /= 2){
cout << " " << H[i];
}
}
int main(){
cin >> H_size >> query_cnt;
for(int i = 1; i <= H_size; i++){
int n;
cin >> n;
H_Insert(n, i);
}
for(int i = 0; i < query_cnt; i++){
int query;
cin >> query;
print(query);
cout << endl;
}
return 0;
}