将一系列给定数字顺序插入一个初始为空的小顶堆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 <cstdio> #include <cstring> #include <climits> #include <vector> #include <queue> #include <map> #include <string> #include <algorithm> using namespace std; const int N = 1e4+10; const int inf = 99999999; int a[N], cnt; void build(int x) { a[++cnt]=x; int t=cnt; while(t>1&&(a[t/2]>a[t])) { a[t]=a[t/2]; a[t/2]=x; t/=2; } a[t]=x; return ; } map<int,int>q; int main() { int n, m, x, y; scanf("%d %d", &n, &m); cnt=0; for(int i=1; i<=n; i++) { scanf("%d", &x); build(x); } for(int i=1; i<=n; i++) q[a[i]]=i; string s; for(int i=0; i<m; i++) { cin>>x; cin>>s; if(s[0]=='a') { cin>>y; getline(cin,s);//可以读空格 if(q[x]/2==q[y]/2) puts("T"); else puts("F"); } else { cin>>s; cin>>s; if(s[0]=='r') { if(q[x]==1) puts("T"); else puts("F"); } else if(s[0]=='p') { cin>>s; cin>>y; if(q[x]==q[y]/2) puts("T"); else puts("F"); } else { cin>>s; cin>>y; if(q[x]/2==q[y]) puts("T"); else puts("F"); } } } return 0; }