zoukankan      html  css  js  c++  java
  • 关于堆的判断

    将一系列给定数字顺序插入一个初始为空的小顶堆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),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−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<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<queue>
    #include<cmath>
    #include<vector>
    #include<cstdlib>
    #include<cstring>
    using namespace std;
    
    #define long long ll
    const int maxn  = 100 + 5;
    
    vector<int>v;
    int n;
    void build(int i)
    {
        if(i == 1)
            return;
        while(i != 1)
        {
            if(v[i] < v[i/2])
            {
                swap(v[i], v[i / 2]);
                i = i/2;
            }
            else
                break;
        }
    }
    void bro(int a,int b)
    {
        int posa,posb;
        for(int i=1;i<=n;i++)
            if(v[i] == a)
                posa = i;
        for(int i=1;i<=n;i++)
            if(v[i] == b)
                posb = i;
        int minn = min(posa,posb);
        int maxx = max(posa,posb);
        if(minn % 2 == 0 && maxx % 2 == 1 && maxx - minn == 1)
            puts("T");
        else
            puts("F");
    }
    void son(int a,int b)
    {
        int posa,posb;
        for(int i=1;i<=n;i++)
            if(v[i] == a)
                posa = i;
        for(int i=1;i<=n;i++)
            if(v[i] == b)
                posb = i;
        if(posa/2 == posb)
            puts("T");
        else
            puts("F");
    }
    void root(int i)
    {
        if(v[1] == i)
            puts("T");
        else
            puts("F");
    }
    void father(int a,int b)
    {
        int posa,posb;
        for(int i=1;i<=n;i++)
            if(v[i] == a)
                posa = i;
        for(int i=1;i<=n;i++)
            if(v[i] == b)
                posb = i;
        if(posb/2 == posa)
            puts("T");
        else
            puts("F");
    }
    int main()
    {
        int k;
        scanf("%d %d",&n,&k);
        v.resize(n+1);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&v[i]);
            build(i);
        }
        while(k--)
        {
            int a;
            char str[100];
            scanf("%d%s",&a,str);
            if(strcmp(str,"and") == 0)
            {
                int b;
                scanf("%d%s%s",&b,str,str);
                bro(a,b);
            }
            else
            {
                scanf("%s",str);
                if(strcmp(str,"a") == 0)
                {
                    int b;
                    scanf("%s%s%d",str,str,&b);
                    son(a,b);
                }
                else
                {
                    scanf("%s",str);
                    if(strcmp(str,"root") == 0)
                    {
                        root(a);
                    }
                    else
                    {
                        int b;
                        scanf("%s%d",str,&b);
                        father(a,b);
                    }
                }
            }
        }
    }
  • 相关阅读:
    Python3基础 dict get 在查询不存在的键时,返回指定的内容
    MySql和Sql的单行注释和多行注释的区别
    MySql Server 5.7的下载及安装详细步骤
    sql Server中临时表与数据表的区别
    Sql Server中集合的操作(并集、差集、交集)学习
    sql server2008 如何获取上月、上周、昨天、今天、本周、本月的查询周期(通过存储过程)
    sql server中的大数据的批量操作(批量插入,批量删除)
    sql Server如何执行批量插入和批量删除
    vs2015 企业版、专业版如何破解(秘钥)
    Dos命令下目录操作
  • 原文地址:https://www.cnblogs.com/smallhester/p/10574058.html
Copyright © 2011-2022 走看看