天梯赛L2-012
-
将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:
x is the root:x是根结点;
x and y are siblings:x和y是兄弟结点;
x is the parent of y:x是y的父结点;
is a child of y:x是y的一个子结点。
输入格式: 每组测试第1行包含2个正整数N(≤1000)和M(≤20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被插入一个初始为空的小顶堆的整数。之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。输出格式: 对输入的每个命题,如果其为真,则在一行中输出T,否则输出F。
模拟堆即可,注意输入可能为负数
#include<bits/stdc++.h>
using namespace std;
const int N=1e4;
int h[1005],n,m,p[20005];
void f(int x){
while(x!=1)
if(h[x]<h[x/2]){
swap(h[x],h[x/2]);
p[h[x]+N]=x;
p[h[x/2]+N]=x/2;
x>>=1;
}
else break;
}
bool ch(string s){
int x=0,y=0,i=0,j,len=s.size();
bool flag=0;
if(s[i]=='-') i++,flag=1;
while(i<len){
if(s[i]>='0'&&s[i]<='9')
x*=10,x+=s[i]-'0';
else break;
i++;
}
if(flag) x*=-1,flag=0;
if(s[i+1]=='a'){
i+=5;
if(s[i]=='-') i++,flag=1;
while(i<len){
if(s[i]>='0'&&s[i]<='9')
y*=10,y+=s[i]-'0';
else break;
i++;
}
if(flag) y*=-1;
if(p[x+N]/2==p[y+N]/2) return 1;
return 0;
}
if(s[len-1]=='t')
if(p[x+N]==1) return 1;
else return 0;
j=i,i=len;
while(s[i-1]<='9'&&s[i-1]>='0') i--;
if(s[i-1]=='-') flag=1;
while(i<len){
if(s[i]>='0'&&s[i]<='9')
y*=10,y+=s[i]-'0';
else break;
i++;
}
if(flag) y*=-1;
if(s[j+4]=='a')
if(p[x+N]/2==p[y+N]) return 1;
else return 0;
else
if(p[x+N]==p[y+N]/2) return 1;
else return 0;
}
int main(){
cin>>n>>m;
string s;
for(int i=1;i<=n;i++){
cin>>h[i];
p[h[i]+N]=i;
f(i);
}
getline(cin,s);
for(int i=1;i<=m;i++){
getline(cin,s);
if(ch(s)) cout<<"T"<<endl;
else cout<<"F"<<endl;
}
return 0;
}