关于堆的判断

Posted xcfxcf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于堆的判断相关的知识,希望对你有一定的参考价值。

将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:

  • x is the rootx是根结点;
  • x and y are siblingsxy是兄弟结点;
  • x is the parent of yxy的父结点;
  • x is a child of yxy的一个子结点。

输入格式:

每组测试第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>

using namespace std;
int H[10010];
int n;

int find(int x) {
    for (int i = 1; i <= n; i++) {
        if (H[i] == x)
            return i;
    }
    return -1;
}

int m, t;

int main() {
    //freopen("in", "r", stdin);
    ios::sync_with_stdio(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> H[i];
        t = i;
        while (t > 1 && H[t] < H[t / 2]) {
            swap(H[t], H[t / 2]);
            t >>= 1;
        }
    }
    while (m--) {
        getchar();
        string s;
        int x;
        cin >> x;
        cin >> s;
        if (s == "and") {
            int y;
            cin >> y;
            cin >> s;
            cin >> s;
            if (find(x) / 2 == find(y) / 2)
                cout << "T" << endl;
            else
                cout << "F" << endl;
        } else {
            cin >> s;
            if (s == "a") {
                int y;
                cin >> s;
                cin >> s;
                cin >> y;
                if (find(x) / 2 == find(y))
                    cout << "T" << endl;
                else
                    cout << "F" << endl;
            } else {
                cin >> s;
                if (s == "root") {
                    if (H[1] == x)
                        cout << "T" << endl;
                    else
                        cout << "F" << endl;
                } else {
                    int y;
                    cin >> s;
                    cin >> y;
                    if (find(y) / 2 == find(x))
                        cout << "T" << endl;
                    else
                        cout << "F" << endl;
                }
            }
        }
    }
    return 0;
}
View Code

 

 

以上是关于关于堆的判断的主要内容,如果未能解决你的问题,请参考以下文章

关于堆的判断

PTA L2-4 关于堆的判断

关于堆的判断

关于堆的判断

L2-012. 关于堆的判断(STL中heap)

L2-012. 关于堆的判断