思路
这题代码长,其实只是懒,没有把重复的代码写成函数。
只用建堆,循环判断就可以了。
循环判断是为了避免数的重复,判断每一中可能的情况是否为真。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
vector<int> heap(maxn);
void siftUp(int i) {
if (i==1) {
return;
}
int flag=0;
while (!flag&&i!=1) {
if (heap[i]<heap[i/2]) {
swap(heap[i],heap[i/2]);
}
else {
flag=1;
}
i=i/2;
}
}
int main()
{
int n,m,tmp;
cin>>n>>m;
for (int i=1;i<=n;i++) {
cin>>tmp;
heap[i]=tmp;
siftUp(i);
}
cin.get();
while (m--) {
string line;
getline(cin,line);
stringstream ss1(line);
string str;
int flag=0;
while (ss1>>str) {
if (str=="root") {
flag=1;
}
else if (str=="siblings") {
flag=2;
}
else if (str=="parent") {
flag=3;
break;
}
else if (str=="child") {
flag=4;
break;
}
}
stringstream ss2(line);
int num1,num2;
if (flag==1){
ss2>>num1;
if (heap[1]==num1) {
cout<<"T"<<endl;
}
else {
cout<<"F"<<endl;
}
}
else if (flag==2){
ss2>>num1;
ss2>>str;
ss2>>num2;
bool flag=false;
for (int i=1;i<=n;i++) {
if (heap[i]==num1) {
for (int j=1;j<=n;j++) {
if (heap[j]==num2) {
if (i!=j&&i/2==j/2) {
flag=true;
goto outloop;
}
}
}
}
}
outloop:
if (flag) {
cout<<"T"<<endl;
}
else {
cout<<"F"<<endl;
}
}
else if (flag==3){
ss2>>num1;
for (int i=0;i<4;i++) {
ss2>>str;
}
ss2>>num2;
bool flag=false;
for (int i=1;i<=n;i++){
if (heap[i]==num1) {
for (int j=1;j<=n;j++) {
if (heap[j]==num2) {
if (j!=i&&j/2==i) {
flag=true;
goto outloop2;
}
}
}
}
}
outloop2:
if (flag) {
cout<<"T"<<endl;
}
else {
cout<<"F"<<endl;
}
}
else if (flag==4) {
ss2>>num1;
for (int i=0;i<4;i++) {
ss2>>str;
}
ss2>>num2;
bool flag=false;
for (int i=1;i<=n;i++){
if (heap[i]==num1) {
for (int j=1;j<=n;j++) {
if (heap[j]==num2) {
if (j!=i&&j==i/2) {
flag=true;
goto outloop3;
}
}
}
}
}
outloop3:
if (flag) {
cout<<"T"<<endl;
}
else {
cout<<"F"<<endl;
}
}
}
return 0;
}