PTAL2-012 關於堆的判斷解題報告---最小堆
阿新 • • 發佈:2019-01-13
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),分別是插入元素的個數、以及需要判斷的命題數。下一行給出區間[−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<algorithm> #include<cmath> #include<cstdio> #include<queue> #include<climits> #include<set> #include<stack> using namespace std; typedef long long ll; typedef unsigned long long ull; static const int MAX_N = 1e3 + 5; int heap[MAX_N]; int n; void insert(int x) { //堆排序建最小堆 while (heap[x >> 1] > heap[x] && x != 1) { int temp = heap[x >> 1]; heap[x >> 1] = heap[x]; heap[x] = temp; x >>= 1; } } int find_parent(int x) { //父節點 int i; for (i = 1; i <= n; i++) { if (heap[i] == x) break; } return heap[i >> 1]; } int main() { int m; scanf("%d%d", &n, &m); scanf("%d", &heap[1]); for (int i = 2; i <= n; i++) { scanf("%d", &heap[i]); insert(i); } while (m--) { int v1; char s1[10]; scanf("%d%s", &v1, s1); if (s1[0] == 'i') { char s2[10], s3[10]; scanf("%s%s", s2, s3); if (s3[0] == 'r') { if (v1 == heap[1]) printf("T\n"); else printf("F\n"); } else if (s3[0] == 'p') { char s4[3]; scanf("%s", s4); int v2; scanf("%d", &v2); if (find_parent(v2) == v1) printf("T\n"); else printf("F\n"); } else if (s3[0] == 'c') { char s4[3]; scanf("%s", s4); int v2; scanf("%d", &v2); if (find_parent(v1) == v2) printf("T\n"); else printf("F\n"); } } else { int v2; char s2[10], s3[10]; scanf("%d%s%s", &v2, s2, s3); if (find_parent(v1) == find_parent(v2)) printf("T\n"); else printf("F\n"); } } return 0; }