题目描述
将一系列给定数字顺序插入一个初始为空的小顶堆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
。
输入样例1
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
输出样例1
F T F T
思路分析
首先反复调整建立小顶堆。
然后拆分字符串判断分出语句。
AC代码
代码语言:javascript复制#include<iostream>
using namespace std;
class MinHeap{
int data[512],n,m;
public:
MinHeap(){
cin>>n>>m;
for(int i=0;i<n;i )
cin>>data[i];
for(int i=n/2;i>=0;i--)
Adjust(i,n-1);
while(m--){
string instruction;
int x,y;
cin>>x>>instruction;
x= Index(x);
if(instruction=="and"){
cin>>y>>instruction>>instruction;
y= Index(y);
if(x>0&&y>0&&x<n&&y<n&&(x-1)/2==(y-1)/2)
cout<<'T'<<endl;
else cout<<'F'<<endl;
}else{
cin>>instruction;
if(instruction=="a"){
cin>>instruction>>instruction>>y;
y= Index(y);
if(y>=0&&x<n&&(x-1)/2==y)
cout<<'T'<<endl;
else cout<<'F'<<endl;
}else{
cin>>instruction;
if(instruction=="root"){
if(x==0)
cout<<'T'<<endl;
else cout<<'F'<<endl;
}else{
cin>>instruction>>y;
y= Index(y);
if(x>=0&&y<n&&(y-1)/2==x)
cout<<'T'<<endl;
else cout<<'F'<<endl;
}
}
}
}
}
void Adjust(int i,int m){
int temp=data[i];
for(int j=2*i 1;j<=m;j=j*2 1){
if(j<m&&data[j]>data[j 1])
j ;
if(data[j]>=temp)
break;
data[i]=data[j];
i=j;
}
data[i]=temp;
}
int Index(int&node){
for(int i=0;i<n;i )
if(node==data[i])
return i;
}
};
int main() {
MinHeap test;
}