7-27.png
分析
cccc里面,一开始看到堆,我心里比较慌,因为太久没有看堆的知识了,后来发现这道题其实不难,就是建一个堆,然后做简单的判断即可
建堆过程:变插入变建堆
判断过程:有点类似于词法分析器,一个一个字符串读入,判断,要注意"26 and 23 are siblings"这种情况,读到23不能完全停下来,还要继续把后面两句读完,不然会影响后面的输入,比赛中的样例要是把这个放到最后一句,那就是个大坑了
ac代码
#include<bits/stdc++.h>
using namespace std;
int n;
int heap[1001];
void insert(int n,int num){
heap[n]=num;
int L=n;
while(L/2>=1){
int temp=L/2;
if(heap[L]<heap[temp]){
int m=heap[L];
heap[L]=heap[temp];
heap[temp]=m;
}
L/=2;
}
}
int find(int a){
for(int i=1;i<=n;i++){
if(a==heap[i]){
return i;
}
}
}
int main(){
int m;
cin>>n>>m;
for(int i=1;i<=n;i++){
int x;cin>>x;
insert(i,x);
}
for(int i=0;i<m;i++){
int a;cin>>a;
string p1;cin>>p1;
if(p1=="and"){
int b;cin>>b;
if(find(a)/2==find(b)/2){
cout<<"T"<<endl;
}else{
cout<<"F"<<endl;
}
string p2,p3;
cin>>p2>>p3;
}else{
string p2;cin>>p2;
if(p2=="a"){
string p3,p4;int b;
cin>>p3>>p4>>b;
if(find(a)/2==find(b)){
cout<<"T"<<endl;
}else{
cout<<"F"<<endl;
}
}else{
string p6;
cin>>p6;
if(p6=="root"){
if(find(a)==1){
cout<<"T"<<endl;
}else{
cout<<"F"<<endl;
}
}else{
string p7;int b;
cin>>p7;
cin>>b;
if(find(a)==find(b)/2){
cout<<"T"<<endl;
}else{
cout<<"F"<<endl;
}
}
}
}
}
}