PTA L2-4 关于堆的判断
先上题面
链接 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 关于堆的判断的更多相关文章
- codevs 2879 堆的判断
codevs 2879 堆的判断 http://codevs.cn/problem/2879/ 题目描述 Description 堆是一种常用的数据结构.二叉堆是一个特殊的二叉树,他的父亲节点比两个儿 ...
- ->code vs 2879 堆的判断(堆的学习一)
2879 堆的判断 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 堆是一种常用的数据结构.二叉堆是一个特殊的二叉树,他的父 ...
- 堆的判断(codevs 2879)
2879 堆的判断 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 堆是一种常用的数据结构.二叉堆 ...
- L2-012. 关于堆的判断
L2-012. 关于堆的判断 题目链接:https://www.patest.cn/contests/gplt/L2-012 终于ac了,简直要哭.题目还是很简单的,不过很多坑: 1.寻找x下标时,有 ...
- pat 团体天梯赛 L2-012. 关于堆的判断
L2-012. 关于堆的判断 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的小顶堆H[] ...
- L2-012. 关于堆的判断(STL中heap)
L2-012. 关于堆的判断 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x and y ...
- 【小顶堆的插入构造/遍历】PatL2-012. 关于堆的判断
L2-012. 关于堆的判断 时间限制 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x a ...
- 【数组模拟-小顶堆的插入构造/遍历】PAT-L2-012.-关于堆的判断--数组模拟
L2-012. 关于堆的判断 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x and y ar ...
- (PAT)L2-012 关于堆的判断 (最小堆)
题目链接:https://www.patest.cn/contests/gplt/L2-012 将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “ ...
随机推荐
- Java集合类(转自hey平平)
一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...
- <转载> UE4的Actor类C++简单尝试
原文链接: 简书小小酥XX https://www.jianshu.com/p/2bcc80f0e789 一开始我用了一段时间UE4,发现如果用蓝图系统真的不太适合我的风格.因为之前一直都是用Un ...
- java切割音频文件
工具: 一个jar包即可:jave-1.0.2.jar 可以切割wav格式的音频文件 完整工程目录 就一个jar包,一个main类 代码: package com.zit; import java.i ...
- 关于C#mvc用iis发布,虚拟目录的问题。
mvc关于iis发布虚拟目录的问题,解决方法是修改代码中路径的方式,例如ajax中常用的为url:“/Home/Index”,可修改为 url: '@Url.Action("Index&qu ...
- java入门day04-方法简述
方法: 是完成特定功能(一个)的代码集合,这些特定功能的代码可以被重复使用. 修饰符 方法返回值类型 方法名(形参列表){ 方法体 }return 返回值: 形如: public static ...
- 搭建SSH框架心得
<Struts2+Spring4+hibernate3> 工程结构 导入相关jar包:自行网上百度即可,根据环境需要 写dao类 以及实现 package com.icommon.dao; ...
- ansible-play中for,if的使用
#迭代循环的使用 #实现同时新建三个文件,同时部署三个服务 --- - host: websrvs remote_user: root task: - name: create some files ...
- python笔记24-os模块
import osprint(os.getcwd())#取当前工作目录#os.chmod('/usr/local',7)#给文件目录加权限,7是最高权限print(os.chdir(r"e: ...
- 常用的settings.xml文件
<?xml version="1.0"?> <settings> <localRepository>/Users/bernie.cx/.m2/r ...
- 记一次msyql导入导致的问题
公司有个项目要导入150M大小的sql文件,但是导入时报错,去网上找答案,很多人说是因为保留字什么什么的,所以就按照sql文件里面的mysql版本又去下载了一份mysql5.6安装好,但是登陆不了,又 ...