L2-012 關於堆的判斷
阿新 • • 發佈:2022-03-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<bits/stdc++.h> using namespace std; priority_queue<int,vector<int>,greater<int> > q; int a[10000]; vector<int> tr; map<int,int> mm; int main(){ string s0,s; int x,y,n,m,flag; cin >> n >> m; for(int i=0;i<n;i++){ cin >> x; tr.push_back(x); make_heap(tr.begin(),tr.end(),greater<int>()); } for(int i=1;i<=n;i++){ a[i]=*tr.end(); tr.erase(tr.begin()); } for(int i=1;i<=n;i++){ mm[a[i]]=i; } /* for(int i=1;i<=n;i++){//test cout << a[i] << " "; }*/ for(int i=0;i<m;i++){ flag=0; cin >> x >> s; if(s[0]=='a'){ cin >> y >> s >> s0; if(mm[x]/2==mm[y]/2) flag=1; } else{ cin >> s >> s0; if(s[0]=='a'){ cin >> s >> y; if(mm[y]*2==mm[x] || mm[y]*2+1==mm[x]) flag=1; } else{ if(s0[0]=='r'){ if(a[1]==x) flag=1; } else{ cin >> s >> y; if(mm[x]*2==mm[y] || mm[x]*2+1==mm[y]) flag=1; } } } if(flag==1) cout << "T" << endl; else cout << "F" << endl; } return 0; }