L2-012 关于堆的判断
手动建立小根堆。
注意每次输入之前都要把之前缓冲区的内容清理掉getline(),以免影响下一次读取。
#include <bits/stdc++.h>
using namespace std;
int a[1010],n,m;
map<int,int> mp;
int main() {
cin>>n>>m;
for(int i=0; i<n; i++) {
cin>>a[i];
mp[a[i]]=i;
}
for(int i=0; i<n; i++) {
//和父亲进行比较、
int j=i;
int parent=(j-1)/2;
while(parent>=0&&a[j]<a[parent]) {
//交换位置
swap(a[parent],a[j]);//元素交换
swap(mp[a[j]],mp[a[parent]]);//元素位置交换
j=parent;
parent=(j-1)/2;
}
}
//打印测试
for(int i=0; i<m; i++) {
int a,b;
string s;
getline(cin,s);
cin>>a>>s;
if(s[0]=='a'){
cin>>b;
if((mp[a]-1)/2==(mp[b]-1)/2){
cout<<"T"<<'\n';
}else{
cout<<"F"<<'\n';
}
} else{
cin>>s>>s;
if(s=="root"){
cout<<(mp[a]==0?"T":"F")<<'\n';
}else if(s=="parent"){
cin>>s>>b;
cout<<(mp[a]==(mp[b]-1)/2?"T":"F")<<'\n';
}else{
cin>>s>>b;
cout<<((mp[a]-1)/2==mp[b]?"T":"F")<<'\n';
}
}
}
return 0;
}