L2-012. 关于堆的判断
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
将一系列给定数字顺序插入一个初始为空的小顶堆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 <iostream> #include<cstring> #include<string> #include<algorithm> using namespace std; int main() { int n,m; cin>>n>>m; int k=1; int a[1005]; for(int i=1;i<=n;i++) { cin>>a[k++]; int p=k-1; while(p!=1&&a[p]<a[p/2]) { int temp=a[p]; a[p]=a[p/2]; a[p/2]=temp; p=p/2; } } int x; for(int i=1;i<=m;i++) { cin>>x; string s; cin>>s; if(s[0]=='a')//“x and y are siblings”:x和y是兄弟结点 { int y; cin>>y; cin>>s; cin>>s; int x1=-1; int y1=-1; for(int j=1;j<=n;j++) { if(a[j]==x) x1=j; if(a[j]==y) y1=j; if(x1!=-1&&y1!=-1) break; } if(x1/2==y1/2) cout<<"T"<<endl;//不能写成x1+1!=y1&&y1+1!=x1 else cout<<"F"<<endl; } else { cin>>s; if(s[0]=='a')//“x is a child of y”:x是y的一个子结点 { cin>>s; cin>>s; int y; cin>>y; int x1=-1; int y1=-1; for(int j=1;j<=n;j++) { if(a[j]==x) x1=j; if(a[j]==y) y1=j; if(x1!=-1&&y1!=-1) break; } if(x1/2==y1) cout<<"T"<<endl; else cout<<"F"<<endl; } else { cin>>s; if(s[0]=='r')//“x is the root”:x是根结点 { if(x==a[1]) cout<<"T"<<endl; else cout<<"F"<<endl; } else //“x is the parent of y”:x是y的父结点; { int y; cin>>s; cin>>y; int x1=-1; int y1=-1; for(int j=1;j<=n;j++) { if(a[j]==x) x1=j; if(a[j]==y) y1=j; if(x1!=-1&&y1!=-1) break; } if(y1/2==x1) cout<<"T"<<endl; else cout<<"F"<<endl; } } } } }