ptaL2-012 关于堆的判断
题目描述:
将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:
x is the root:x是根结点;
x and y are siblings:x和y是兄弟结点;
x is the parent of y:x是y的父结点;
x is a child of y:x是y的一个子结点。
输入格式:
每组测试第1行包含2个正整数N(≤ 1000)和M(≤ 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被插入一个初始为空的小顶堆的整数。之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。
输出格式:
对输入的每个命题,如果其为真,则在一行中输出T,否则输出F。
输入样例:
5 4
46 23 26 24 10
24 is the root
26 and 23 are siblings
46 is the parent of 23
23 is a child of 10
输出样例:
F
T
F
T
简要分析:
1)
2)
3)
4)
得下图:
5)
得下图:
答案:
#include <iostream>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int n, m;
int a[1001];
void up(int len){
int u = len;
while(u>1&&a[u>>1]>a[u]){
swap(a[u>>1],a[u]);
u = u>>1;
}
}
bool fun(int child, int parent){
int t = 1;
for(int i=1;i<=n;i++){
if(a[i]==child){
t = i;
break;
}
}
if(t>n) return 0;
t = t>>1;
return a[t]==parent;
}
int main(int argc, char** argv) {
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
up(i);
}
while(m--){
bool f = 0;
string s;
int num1, num2;
cin>>num1;
cin>>s;
if(s=="is"){
cin>>s;
if(s=="a"){
cin>>s>>s>>num2;
f = fun(num1,num2);
}else{
cin>>s;
if(s=="root"){
if(a[1]==num1) f = 1;
}else{
cin>>s>>num2;
f = fun(num2,num1);
}
}
}else{
cin>>num2>>s>>s;
int t1 = 0, t2 = 0;
for(int i=1;i<=n;i++){
if(a[i]==num1){
t1 = i;
}
if(a[i]==num2){
t2 = i;
}
}
if(num1!=num2&&a[t1>>1]==a[t2>>1]) f = 1;
}
if(f) cout<<"T"<<endl;
else cout<<"F"<<endl;
}
return 0;
}