L2-012 关于堆的判断 (25 分)(分类讨论)

简介: 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


输入样例:

1. 5 4
2. 46 23 26 24 10
3. 24 is the root
4. 26 and 23 are siblings
5. 46 is the parent of 23
6. 23 is a child of 10

结尾无空行


输出样例:

1. F
2. T
3. F
4. T

结尾无空行


思路:把堆存入数组之中,i的左孩子为2*i,右孩子为2*i+1,用x1来表示x的下标,用y1来表示y的下标,x是根结点等价于x==h[1],x和y是兄弟结点等价于和x和y具有相同的父节点,即:h[x1/2]==h[y1/2],x是y的父结点等价于h[x1]==h[y1/2],x是y的一个子结点等价于h[x1/2]==h[y1]

#include<iostream>
using namespace std;
const int N=1010;
int main()
{
    int n,h[N],m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>h[i];
    for(int i=1;i<=n;i++)//建立小根堆
    {
        int k=i;
        while(k>1&&h[k]<h[k/2])
        {
            swap(h[k],h[k/2]);
            k/=2;
        }
    }
    while(m--)
    {
        int x,y,x1,y1;
        string s1,s2,s3,s4;
        cin>>x>>s1;
        if(s1=="and")
        {
            cin>>y>>s2>>s3;
            for(int i=1;i<=n;i++)
            {
                if(h[i]==x) x1=i;
                if(h[i]==y) y1=i;//找到对应的下标
            }
            if(h[x1/2]==h[y1/2]) cout<<"T\n";
            else cout<<"F\n";
        }
        else
        {
            cin>>s2;
            if(s2=="a")
            {
                cin>>s3>>s4>>y;
                for(int i=1;i<=n;i++)
                {
                    if(h[i]==x) x1=i;
                    if(h[i]==y) y1=i;//找到对应的下标
                }
                if(h[x1/2]==h[y1]) cout<<"T\n";
                else cout<<"F\n";
            }
            else
            {
                cin>>s3;
                if(s3=="root")
                {
                    if(x==h[1]) cout<<"T\n";
                    else cout<<"F\n";
                }
                else
                {
                    cin>>s4>>y;
                    for(int i=1;i<=n;i++)
                    {
                        if(h[i]==x) x1=i;
                        if(h[i]==y) y1=i;//找到对应的下标
                    }
                    if(h[x1]==h[y1/2]) cout<<"T\n";
                    else cout<<"F\n";
                }
            }
        }
    }
    return 0;
}
目录
相关文章
CCF推荐A类会议和期刊总结:计算机体系结构/并行与分布计算/存储系统领域
中国计算机学会(CCF)2022年版推荐目录涵盖了计算机体系结构、并行与分布计算、存储系统领域的多个A类会议和期刊。本文汇总了这些顶级资源的全称、出版社、dblp网址及领域。包括《ACM计算机系统汇刊》、《ACM存储汇刊》等期刊,以及ACM PPoPP、USENIX FAST等会议,为研究人员提供了重要学术参考。
13473 64
CCF推荐A类会议和期刊总结:计算机体系结构/并行与分布计算/存储系统领域
|
6天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
614 216
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
857 61
|
7天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1289 157
|
5天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
243 138
|
7天前
|
存储 安全 固态存储
四款WIN PE工具,都可以实现U盘安装教程
Windows PE是基于NT内核的轻量系统,用于系统安装、分区管理及故障修复。本文推荐多款PE制作工具,支持U盘启动,兼容UEFI/Legacy模式,具备备份还原、驱动识别等功能,操作简便,适合新旧电脑维护使用。
531 109