将一系列给定数字顺序插入一个初始为空的小顶堆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

思路:

先来一波概念~

小顶堆:是一种经过排序的完全二叉树(树的节点是按从上到下,从左到右的顺序紧凑排列的),其中任一非终端节点的数据值均不大于其左子节点和右子节点的值。

heap[i]:=位置i存的元素值。

若从heap[0]开始存,可知:

左儿子编号是自己编号*2+1

右儿子编号是自己编号*2+2

  • 小顶堆插入数据时:

首先先在堆的末尾(在最后一层,最左边)插入该数值,然后不断向上提升至到它比父节点大为止。

  • 小顶堆删除最小值时:

先把堆中最后一个元素复制到根节点,并且删除最后一个节点。然后不断向下交换直到没有大小点到为止。

若向下交换的时候,左右节点都小于此节点,则交换最小的节点。

模板:

void push(int x){int i=sz++;while(i>0){int p=(i-1)/2;if(heap[p]<=x)break;heap[i]=heap[p];i=p;}heap[i]=x;
}int pop(){int ret=heap[0];int x=heap[--sz];int i=0;while(i*2+1<sz){//点i位置存在左子树即可,因为可能本来就不存在右子树int c1=i*2+1,c2=i*2+2;if(c2<sz&&heap[c1]>heap[c2])c1=c2;if(heap[c1]>=x)break;heap[i]=heap[c1];i=c1;}heap[i]=x;return ret;
}

ps:处理的时候,别忘了还有负数的情况哒~

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef pair<int,int>P;
const int INF=0x3f3f3f3f;
const int N=1005,N1=5005,mod=32767;
int heap[N],sz=0;
string s;
map<int,int>pos;void push(int x){int i=sz++;while(i>0){int p=(i-1)/2;if(heap[p]<=x)break;heap[i]=heap[p];i=p;}heap[i]=x;
}int getx(int po){int x=0;int tmp=1;while(s[po]!=' '&&s[po]!='-'&&po>=0){x+=(s[po]-'0')*tmp;tmp*=10;po--;}if(s[po]=='-')return -x;return x;
}int solve(){int flag,len=s.length(),x=0,y=0;for(int i=0;i<len;i++){if(s[i]==' '){x=getx(i-1);if(s[i+1]=='a'){flag=2;y=getx(len-14);}else if(i+11==len-1)flag=1;else if(s[i+4]=='t'){flag=3;y=getx(len-1);}else if(s[i+4]=='a'){flag=4;y=getx(len-1);}break;}}if(flag==1){if(heap[0]==x)return true;else return false;}if(flag==2){int p1=pos[x],p2=pos[y];if(p1>p2)swap(p1,p2);if(p1%2&&p2-p1==1)return true;else return false;}if(flag==3){int p1=pos[x],p2=pos[y];if((p2-1)/2==p1)return true;else return false;}if(flag==4){int p1=pos[x],p2=pos[y];if((p1-1)/2==p2)return true;else return false;}
}int main(){int n,m,t,x,y;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&t);push(t);}for(int i=0;i<n;i++){int x=heap[i];pos.insert(pair<int,int>(x,i));}getchar();while(m--){getline(cin,s);int ans=solve();if(ans)printf("T\n");else printf("F\n");}
}

L2-012 关于堆的判断 - 小顶堆(详解)相关推荐

  1. python树结构实现小顶堆_数据结构和算法入门之小顶堆和大顶堆Python实现

    首先简单提一下小顶堆和大顶堆,其本质是一颗完全二叉树,不同点在于:除叶子节点外,小顶堆的每个父节点的key都要比其左右两个子节点的key小:大顶堆的每个父节点的key都要比其左右两个子节点的key大. ...

  2. 大顶堆,小顶堆——排序问题

    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 例如, [2 ...

  3. java实现小顶堆 在指定数据中找出前n大的数

    小顶堆: 我们利用的特性:每个节点都比左右孩子小 图示: 取数组前n个数,构成小顶堆 然后从数组里面获取数据,如果比堆顶小,直接抛弃,如果比堆顶大,就替换堆顶,并调整堆,使堆始终满足小顶堆的特性 93 ...

  4. 剑指offer:数据流中的中位数(小顶堆+大顶堆)

    1. 题目描述 /**如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的 ...

  5. 堆排序:大顶堆和小顶堆 + 前K个高频元素

    堆 一.堆排序 小顶堆 举个栗子 大顶堆 二.前K个高频元素 思路分析 三.构造器代码解析 一.堆排序 要了解大顶堆和小顶堆,我们先简单了解一下堆排序. 堆排序(Heapsort)是指利用堆这种数据结 ...

  6. Java堆排序(大顶堆小顶堆及应用实例)

    自己理解所得,如有错误欢迎随时指摘: 目录: 堆概念 堆结构 堆排序步骤 大顶堆代码.小顶堆代码 实际应用及实例代码 小顶堆删除图解代码.插入代码 小顶堆插入图解 时间复杂度分析 1.百度->概 ...

  7. 数据结构之堆——C++实现大顶堆和小顶堆

    大小顶堆的实现 什么是大顶堆和小顶堆 大小顶堆的底层实现 代码实现小顶堆 定义小顶堆类 构造函数 插入 扩大堆数组容量 删除 析构函数 代码实现大顶堆 测试 什么是大顶堆和小顶堆 堆是一种完全二叉树. ...

  8. 小顶堆数据结构C/C++代码实现

    相比队列和栈,很多人可能对堆的概念比较陌生,下面个给出堆的本质概念 一.堆也是一种数据结构,从实际应用意义来说,他是一种最优级别数据永远在第一位的队列,本文皆以最小值为例(小顶堆),即它变相是一种会永 ...

  9. 小顶堆时间复杂度_时间轮算法以及时间轮在Netty和Kafka中的应用的

    大家好,我是yes. 最近看 Kafka 看到了时间轮算法,记得以前看 Netty 也看到过这玩意,没太过关注.今天就来看看时间轮到底是什么东西. 为什么要用时间轮算法来实现延迟操作? 延时操作 Ja ...

最新文章

  1. 201421123042 《Java程序设计》第8周学习总结
  2. CC254x--API
  3. Java 添加、更新和移除PDF超链接
  4. 糖果(信息学奥赛一本通-T1299)
  5. textbox的textmode取为multiline多行时,其maxlength不起作用
  6. mysql 回表 覆盖索引_mysql 14 覆盖索引+回表
  7. Python学习笔记14(socket编程)
  8. 25 岁的老 Delphi,还值得程序员入手吗?
  9. matlab中设置拟合初值,如何确定自定义函数拟合时的参数初值?
  10. 国外大神一张图学会python-没有接触过编程Python难学吗?
  11. 【leetcode】复写零
  12. 9.2NOIP模拟题
  13. 数组去重和两个数组求交集
  14. [导入]关于:web.config 的配置说明
  15. windows php_redis.dll 官方下载地址 php5x php7x
  16. linux下安装oracle instant client,linux下安装Oracle instant client
  17. 判断一个数字是不是素数
  18. 如何根据小米12手机电池信息计算充电时间
  19. [19保研]清华大学交叉信息研究院优秀大学生夏令营
  20. 7-1 计算存款利息 (10分) 本题目要求计算存款利息

热门文章

  1. 多年阅读《经济学人》是一种什么体验?
  2. c#设计12星座速配软件_如何用c#制作一款星座查询软件
  3. 硬件手册——PT100精密测温电路
  4. 如何为孩子挑选有益的玩具
  5. vue 解决安装less插件后出现错误:Analyzer will use module sizes from stats file.
  6. 八大视频监控软件对比
  7. 计算机二级常见知识点语言,计算机二级考试语言知识点总结.doc
  8. 企业大数据战略规划高级培训课程
  9. 那些职场高手,都是怎么解决问题的?
  10. 计算机网络系统维护和管理,计算机网络系统维护和管理技术.doc