L2-012 关于堆的判断 (25 分)
将一系列给定数字顺序插入一个初始为空的小顶堆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),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间内的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> #define ll long long int #define mod 998244353 using namespace std; int n,a[1005]; void up(int x)//建立小顶堆 { int t = a[x]; int tx= x; while(tx>1&&a[tx/2]>t) { a[tx] = a[tx/2]; tx = tx/2; } a[tx] = t; } void changeid(int t) { a[++n] = t; up(n); } int main() { int k,m,x,y,iny; map<int,int>index; cin>>k>>m; string s; n = 0; for(int i=0;i<k;i++) { cin>>x; changeid(x); } for(int i=1;i<=n;i++) { index[a[i]] = i; } for(int i=0;i<m;i++) { cin>>x>>s; int inx = index[x]; if(s[0]=='a') { cin>>y; getline(cin,s); iny = index[y]; if(inx/2==iny/2) { printf("T\n"); } else printf("F\n"); } else { cin>>s>>s; if(s[0]=='r') { if(inx==1) printf("T\n"); else printf("F\n"); } else if(s[0]=='p') { cin>>s>>y; iny = index[y]; if(iny/2==inx) printf("T\n"); else printf("F\n"); } else { cin>>s>>y; iny = index[y]; if(iny==inx/2) printf("T\n"); else printf("F\n"); } } } return 0; }