先上题面  

链接 https://pintia.cn/problem-sets/994805046380707840/problems/994805064676261888

  首先,题目描述的很清楚,这是一个关于最小堆的问题。题目的意思就是根据插入顺序建一个最小堆,然后对给出的命令进行判断,输出T or F。

  因为堆其实就是一种特殊的二叉树,它具有两个性质: 1.结构性:用数组表示的完全二叉树。

                          2. 有序性:任一结点的关键字是其子树所有结点的最大值(最大堆)或最小值(最小堆)。

按照上述,我们应该很容易想到用数组存储这个堆,因为这样方便的进行元素的插入以及交换。

接下来就是进行建堆操作

其操作如下:

1.先将要插入的元素放在数组的末尾。

2.进行上浮交换操作,如果它小于它的父节点(在数组中表示为 i/2 ),则就进行交换。

3.不断插入元素,重复执行1,2操作。

完成建堆操作后,因为接下来进行的查询操作给出的是值,而我们则要根据下标来判断他们之间的关系。

所以要建立一个map映射关系,同时,因为查询中有父子结点的关系的判断,因此可以开个数组存储父子节点关系。

最后,就是执行查询操作了,输入的查询语句有一定规律,这个将在下面的代码中展示。

tips:因为输入的值存在负值,所以可以令num[0] = -1001,令num[1] - num[N]存值,这样才能保证建堆正确。

#include <cstdio>
#include <vector>
#include <map>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int H[],fa[],depth[];
map<int,int>mp;
void dui(int val,int site)
{
for(;val<H[site/]&&site>;site/=)
{
swap(H[site],H[site/]);
} return ;
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
scanf("%d",&H[]);
H[] = -;
for(int i = ;i<=n;i++)
{
scanf("%d",&H[i]);
dui(H[i],i);
}
for(int i = ;i<=n;++i)
mp[H[i]] = i;
fa[] = ;
for(int i = ;i<=n;i++)
{
fa[i] = H[i/]; }
int a,b;
string s;
while(m--)
{
bool flag;
scanf("%d",&a);
cin >> s;
if(s=="is")
{
cin >>s>>s;
if(s=="root")
{
if(H[]==a)
flag = true;
else
flag = false;
}
else if(s=="child")
{
cin >> s;
scanf("%d",&b);
// printf("a==%d b==%d\n",a,b);
if(fa[mp[a]]==b)
flag = true;
else
flag = false;
}
else
{
cin >> s;
scanf("%d",&b);
if(fa[mp[b]]==a)
flag = true;
else
flag = false; }
}
else
{
scanf("%d",&b);
cin >>s >>s;
if(fa[mp[a]]==fa[mp[b]])
flag = true;
else
flag = false;
}
if(flag)
printf("T\n");
else
printf("F\n");
} return ;
}

如果有所帮助,不胜荣幸。

PTA L2-4 关于堆的判断的更多相关文章

  1. codevs 2879 堆的判断

    codevs 2879 堆的判断 http://codevs.cn/problem/2879/ 题目描述 Description 堆是一种常用的数据结构.二叉堆是一个特殊的二叉树,他的父亲节点比两个儿 ...

  2. ->code vs 2879 堆的判断(堆的学习一)

    2879 堆的判断  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold   题目描述 Description 堆是一种常用的数据结构.二叉堆是一个特殊的二叉树,他的父 ...

  3. 堆的判断(codevs 2879)

    2879 堆的判断  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 堆是一种常用的数据结构.二叉堆 ...

  4. L2-012. 关于堆的判断

    L2-012. 关于堆的判断 题目链接:https://www.patest.cn/contests/gplt/L2-012 终于ac了,简直要哭.题目还是很简单的,不过很多坑: 1.寻找x下标时,有 ...

  5. pat 团体天梯赛 L2-012. 关于堆的判断

    L2-012. 关于堆的判断 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的小顶堆H[] ...

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

    L2-012. 关于堆的判断   将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x and y ...

  7. 【小顶堆的插入构造/遍历】PatL2-012. 关于堆的判断

    L2-012. 关于堆的判断 时间限制   将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x a ...

  8. 【数组模拟-小顶堆的插入构造/遍历】PAT-L2-012.-关于堆的判断--数组模拟

    L2-012. 关于堆的判断 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x and y ar ...

  9. (PAT)L2-012 关于堆的判断 (最小堆)

    题目链接:https://www.patest.cn/contests/gplt/L2-012 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “ ...

随机推荐

  1. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  2. learning makefile string example

  3. JS数组映射详解

    现在这里占个坑位,免的忘了,需要整理一下最近的内容: 1.数组映射的使用 2.微信分享功能详解 3.jq自己封装 4.HTML的富文本应用

  4. 《程序设计入门——C语言》翁恺老师 第二周编程练习记录

    1 逆序的三位数(5分) 题目内容: 逆序的三位数: 程序每次读入一个正三位数,然后输出逆序的数字.注意,当输入的数字含有结尾的0时,输出不应带有前导的0.比如输入700,输出应该是7. 提示:用%1 ...

  5. qr-mili Tekniskt stöd

    qr-mili Är ett QR-kodverktyg Identifiera enkelt QR-koder Generera QR-kod Skapa en QR-kod med logotyp ...

  6. Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】

    接着上一篇Shadow Properties之美(一),我们来继续举一个有点啰嗦的栗子. 先看简单需求:某HR系统,需要记录员工资料.需要记录的资料有: 员工号(规则:分公司所在城市拼音首字母,加上三 ...

  7. python笔记19-递归调用

    递归调用: 一个函数自己调用自己就是递归调用,最多一个函数递归调用自己999 #例子,递归调用最多999次,类似循环def hello(): print('hello') hello()hello() ...

  8. Mad Libs 游戏

    name1=input('请输入一个名字:') name2=input('再输入一个名字:') print('丑不拉几的{}被美丽的{}给迷得神魂颠倒'.format(name1,name2)) in ...

  9. undo系统参数详解

    查看与undo相关的系统参数 1.undo_management 有两个参数值:auto.manual(默认) manual:系统启动后使用rollback segment存储undo信息: auto ...

  10. python之django母板页面

    其实就是利用{% block xxx %}   {% endblock %}的方式定义一个块,相当于占位.存放在某个html中,比如base.html 然后在需要实现这些块的文件中,使用继承{% ex ...