https://pintia.cn/problem-sets/994805046380707840/problems/994805064676261888
将一系列给定数字顺序插入一个初始为空的小顶堆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<algorithm>
#include<cstring>
#include<sstream>
#include<vector>
#include<iostream>
using namespace std;
int a[10010];
void up(int u)
{
while(u/2 && a[u/2]>a[u])
{
swap(a[u/2],a[u]);
u/=2;
}
}
int i2s(string a)//字符串转整形
{
stringstream str(a);
int b;
str>>b;
return b;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
up(i);//每次插入一个就调整为小根堆
}
vector<string> b;
string temp;
getchar();///注意在用getline之前有输入所以要用getchar
while(m--)
{
b.clear();
getline(cin,temp);
int i=0;
stringstream water(temp);
string temp2;
while(water>>temp2)//把每一行转化为字符串数组
{
b.push_back(temp2);
}
if(b[3]=="root")
{
int root=i2s(b[0]);
if(a[1]==root ) printf("T\n");
else printf("F\n");
}
else if(b[1]=="and")
{
int a1=i2s(b[0]);
int a2=i2s(b[2]);
int id1,id2;
for(int j=1;j<=n;j++)
{
if(a[j]==a1) id1=j;
if(a[j]==a2) id2=j;
}
if(id1/2==id2/2) printf("T\n");
else printf("F\n");
}
else if(b[3]=="parent")
{
int a1=i2s(b[0]);
int a2=i2s(b[5]);
int id1,id2;
for(int j=1;j<=n;j++)
{
if(a[j]==a1) id1=j;
if(a[j]==a2) id2=j;
}
if(id2/2==id1) printf("T\n");
else printf("F\n");
}
else {
int a1=i2s(b[0]);
int a2=i2s(b[5]);
int id1,id2;
for(int j=1;j<=n;j++)
{
if(a[j]==a1) id1=j;
if(a[j]==a2) id2=j;
}
if(id1/2==id2) printf("T\n");
else printf("F\n");
}
}
}