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[].随后判断一系列相关命题是否为真.命题分下列几种: “ ...
随机推荐
- javascript 判断质数
1.判断n是否为number类型,是否为整数,是否小于2: 2.若n == 2返回true: 3.从3至n的算术平方根(square)之间的奇数,如果n取余为0,则不是奇数. var isPrime ...
- 微信或QQ屏蔽域名,爆红域名如何在微信打开,如何进行微信域名防封?
近很多朋友都会遇到这个问题,为什么我的微信域名或者QQ域名怎么总是提示拦截呢?在这里跟大家说一下吧: 第一点:就是域名里面的内容违规或者诱导被举报而导致的拦截 第二点:就是被用户或者同行恶意举报而导致 ...
- git操作github仓库基本操作
一.登录 首次登录 $ git config --global user.name "Your Name" $ git config --global user.email ‘yo ...
- python学习小总结(列表、元组、字典、集合、字符串)
---恢复内容开始--- 一.列表(list) 1.添加 append():追加,在列表末尾添加元素. 列表名.append(添加的元素) extend():扩展,在列表末尾添加元素. 列表名.ext ...
- js中关于声明提前的几个误区
声明提前: 在程序正式执行之前,都会将所有的var声明的变量提前到开始位置,集中创建,而赋值留在原地. 例如这样一段代码 console.log(a) var a = 100; console.log ...
- [2003_p1]乒乓球
一道因为输出不一样疯狂超时的题目(是我太菜,但是我jio得代码是ok的) 题目描述 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的 ...
- linux - whatis 提示 ls: nothing appropriate
linux 执行命令 whatis 时,提示: ls: nothing appropriate 原因:whatis是在数据库中执行查找操作,这个数据库是定期更新的, 新安装的系统,系统没有更新,没有这 ...
- shell_base
1.使用if_then语句if command then commands fi 先运行if后面的命令,如果命令的退出状态是0(成功执行命令),就将执行then后面,fi前面的所有命令.否则就跳到fi ...
- 上传文件的三种方式xhr,ajax和iframe及上传预览
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- go语言关于线程与通道channal
在go语言中,封装了多线程的使用方法,使其变得简单易用. 在这里说说自己一点体会,不正确的地方还是请各位大牛指正. 关于go语言的并发机制,这很简单,在你要执行的函数前面加上go即可 比如: pack ...