写在前面的废话
今天把追了两个星期的小说看完了…感觉很是感慨啊,
在这里纪念一下:
我欲乘风向北行,雪落轩辕大如席。
我欲借船向东游,绰约仙子迎风立。
我欲踏云千万里,庙堂龙吟奈我何?
昆仑之巅沐日光,沧海绝境见青山。
长风万里燕归来,不见天涯人不回!
记得,我们都是少年。
输时不悲,赢时不谦。手中握剑,心中有义。见海辽远,就心生豪迈。见花盛开,不掩心中喜悦。前路有险,却不知所畏。有友在旁,就想醉酒高歌。想笑了就大声笑,想骂了就破口骂,人间道理万卷书,只求随心随行!
…
没有小说看的今夜开始有些无聊了啊
放张萧瑟康康~
题目描述
将一系列给定数字顺序插入一个初始为空的小顶堆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<bits/stdc++.h>
using namespace std;
const int N=1086;
int siz,m;
int h[N];
string s;
void down(int x){
int u=x;
if(u*2<=siz&&h[u*2]<h[x]) x=u*2;
if(u*2+1<=siz&&h[u*2+1]<h[x]) x=u*2+1;
if(u!=x){
swap(h[u],h[x]);
}
}
void up(int x){
while(x/2&&h[x/2]>h[x]) swap(h[x],h[x/2]),x/=2;
}
int check(){
if(s[1]=='a') return 2;//兄弟
if(s[4]=='t') return 3;//父节点
if(s[4]=='a') return 4; //子节点
}
int main(){
cin>>siz>>m;
for(int i=1;i<=siz;i++) cin>>h[i],up(i);
//for(int i=siz/2;i;i--) down(i);
while(m--){
int x;
s="";
cin>>x;
getline(cin,s);
bool A=0;
if(s.compare(" is the root")==0){
if(h[1]==x) cout<<"T"<<endl;
else cout<<"F"<<endl;
continue;
}
int k=check();
int num=0,j;
if(k==2){
for(int i=5;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9')
num=num*10+s[i]-'0';
else
if(i!=5) break;
}
if(s[5]=='-') num*=(-1);
for(int i=1;i<=siz;i++)
if(num==h[i]){
j=i;break;
}
if(j%2) j--;
else j++;
if(h[j]==x) A=1;
}else if(k==3){
for(int i=18;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9')
num=num*10+s[i]-'0';
}
if(s[18]=='-') num*=(-1);
//cout<<num<<endl;
for(int i=1;i<=siz;i++)
if(num==h[i]){
j=i;break;
}
if(h[j/2]==x) A=1;
}else{
for(int i=15;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9')
num=num*10+s[i]-'0';
}
//cout<<num<<endl;
if(s[15]=='-') num*=(-1);
//cout<<num<<endl;
for(int i=1;i<=siz;i++)
if(num==h[i]){
j=i;break;
}
if(h[j*2]==x||h[j*2+1]==x) A=1;
}
if(A) cout<<"T";
else cout<<"F";
cout<<endl;
}
return 0;
}