您的位置:首页 > 其它

04-树9. Path in a Heap (25) -- 小堆树-利用其性质

2015-08-22 16:12 323 查看
题目地址:http://www.patest.cn/contests/mooc-ds/04-%E6%A0%919

/*
04-树9. Path in a Heap (25) http://www.patest.cn/contests/mooc-ds/04-%E6%A0%919 
节点编号为i的 两个孩子编号 2*i , 2*i+1
一个节点编号为i的父节点编号  i/2(i为奇数和偶数都一样)
*/
#include <cstdio>
#include <sstream>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <cmath>
#include <set>
#include <map>
#include <unordered_map>
#include <stack>

using namespace std;

#define N 1001
int n, m;

int a
; // 每一个编号的数据,从1开始

void insert2a(int num, int index)
{
if (index == 1)
a[1] = num;
else{
int parent = -1;
// 不断的调整到根节点
while (parent != 1)
{
parent = index / 2;
if (num >= a[parent])
{
a[index] = num;
break;
}
else{
int tmp = a[parent];
a[parent] = num;
a[index] = tmp;
}
index = parent;
}
}
}

int main()
{
//freopen("in", "r", stdin);
scanf("%d%d", &n, &m);
int i, tmp;

for (i = 1; i <= n; i++)
{
scanf("%d", &tmp);
insert2a(tmp, i);
}

//vector<int> v;
for (i = 0; i < m; i++)
{
scanf("%d", &tmp);
while (tmp != 1)
{
printf("%d ", a[tmp]);
tmp = tmp / 2;
}
printf("%d\n",a[1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: