将一系列给定数字顺序插入一个初始为空的小顶堆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
今天是隔离的最后一天,明天就自由了,但是回家这些天一直处于一个死人的状态,明天也应该打起精神做点事了。
这个题最开始吓到我了,因为是 堆 我 的 数据结构贼菜
于是我先回忆了一下建堆的办法 用网上的办法 数组建小顶堆
但是我认为我给这个题做难了
是指在后面文字判断方面 但是还好 经过改动做出来了
(因为文字是固定的 我可以多用几个字符串来接受多余字符串,这样在接受数字的时候就没那么麻烦了)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include<stack>
#include<map>
#include <vector>
#include<algorithm>
using namespace std;
int heap[1001];
void setheap(int n,int num){
heap[n]=num;
int l=n;
while(l/2>=1){
int t=l/2;
if(heap[l]<heap[t]){
swap(heap[l],heap[t]);
}
l=l/2;
}
}
int find(int n,int a){
for(int i=1;i<=n;i++)
{
if(a==heap[i])
return i;
}
}
int main(){
int n,m;
cin >>n >> m;
for(int i=1;i<=n;i++)
{
int t;
cin >>t;
setheap(i,t);
}
for(int i=0;i<m;i++)
{
int a;
cin >>a;
string s;
cin >>s;
if(s=="and"){
int b;
cin>>b;
string s2;
getline(cin,s2);
if(find(n,a)/2==find(n,b)/2)
{
cout<<"T"<<endl;
}
else
cout<<"F"<<endl;
}
else
{
string s3;
getline(cin,s3);
int p;
p=s3.size();
if(s3.find("parent")!=s.npos)
{
int b=0;
int i=1;
while(s3[p-i]!=' '){
if(s3[p-i]=='-')
{
b=-b;
break;
}
b=b+(s3[p-i]-'0')*pow(10,i-1);
i++;
}
if(find(n,a)==find(n,b)/2)
cout<<"T"<<endl;
else
cout<<"F"<<endl;
}
else if(s3.find("child")!=s.npos)
{
int b=0;
int i=1;
while(s3[p-i]!=' '){
if(s3[p-i]=='-')
{
b=-b;
break;
}
b=b+(s3[p-i]-'0')*pow(10,i-1);
i++;
}
if(find(n,a)/2==find(n,b))
cout<<"T"<<endl;
else
cout<<"F"<<endl;
}
else{
if(find(n,a)==1)
cout<<"T"<<endl;
else
cout<<"F"<<endl;
}
}
}
}