1. 程式人生 > 其它 >L2-012 關於堆的判斷

L2-012 關於堆的判斷

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;
}