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);
                    }
                }
            }
        }
    }
  • 相关阅读:
    ZOJ3329One Person Game(循环型 数学期望)
    ZOJ3551Bloodsucker (数学期望)
    HDU3853LOOPS (师傅逃亡系列•三)(基础概率DP)
    HDU4035 Maze(师傅逃亡系列•二)(循环型 经典的数学期望)
    阿里云DataV专业版发布,为可视化创造更多可能!
    Logtail提升采集性能
    达摩院首席数据库科学家李飞飞:云原生新战场,我们如何把握先机?
    什么是最佳的视频用户体验?阿里云视频服务四大体验优化实践
    Lambda plus: 云上大数据解决方案
    基于大数据的舆情分析系统架构
  • 原文地址:https://www.cnblogs.com/smallhester/p/10574058.html
Copyright © 2011-2022 走看看