L2-012 关于堆的判断 - 小顶堆(详解)
将一系列给定数字顺序插入一个初始为空的小顶堆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
。
输入样例:
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 关于堆的判断 - 小顶堆(详解)相关推荐
- python树结构实现小顶堆_数据结构和算法入门之小顶堆和大顶堆Python实现
首先简单提一下小顶堆和大顶堆,其本质是一颗完全二叉树,不同点在于:除叶子节点外,小顶堆的每个父节点的key都要比其左右两个子节点的key小:大顶堆的每个父节点的key都要比其左右两个子节点的key大. ...
- 大顶堆,小顶堆——排序问题
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 例如, [2 ...
- java实现小顶堆 在指定数据中找出前n大的数
小顶堆: 我们利用的特性:每个节点都比左右孩子小 图示: 取数组前n个数,构成小顶堆 然后从数组里面获取数据,如果比堆顶小,直接抛弃,如果比堆顶大,就替换堆顶,并调整堆,使堆始终满足小顶堆的特性 93 ...
- 剑指offer:数据流中的中位数(小顶堆+大顶堆)
1. 题目描述 /**如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的 ...
- 堆排序:大顶堆和小顶堆 + 前K个高频元素
堆 一.堆排序 小顶堆 举个栗子 大顶堆 二.前K个高频元素 思路分析 三.构造器代码解析 一.堆排序 要了解大顶堆和小顶堆,我们先简单了解一下堆排序. 堆排序(Heapsort)是指利用堆这种数据结 ...
- Java堆排序(大顶堆小顶堆及应用实例)
自己理解所得,如有错误欢迎随时指摘: 目录: 堆概念 堆结构 堆排序步骤 大顶堆代码.小顶堆代码 实际应用及实例代码 小顶堆删除图解代码.插入代码 小顶堆插入图解 时间复杂度分析 1.百度->概 ...
- 数据结构之堆——C++实现大顶堆和小顶堆
大小顶堆的实现 什么是大顶堆和小顶堆 大小顶堆的底层实现 代码实现小顶堆 定义小顶堆类 构造函数 插入 扩大堆数组容量 删除 析构函数 代码实现大顶堆 测试 什么是大顶堆和小顶堆 堆是一种完全二叉树. ...
- 小顶堆数据结构C/C++代码实现
相比队列和栈,很多人可能对堆的概念比较陌生,下面个给出堆的本质概念 一.堆也是一种数据结构,从实际应用意义来说,他是一种最优级别数据永远在第一位的队列,本文皆以最小值为例(小顶堆),即它变相是一种会永 ...
- 小顶堆时间复杂度_时间轮算法以及时间轮在Netty和Kafka中的应用的
大家好,我是yes. 最近看 Kafka 看到了时间轮算法,记得以前看 Netty 也看到过这玩意,没太过关注.今天就来看看时间轮到底是什么东西. 为什么要用时间轮算法来实现延迟操作? 延时操作 Ja ...
最新文章
- 201421123042 《Java程序设计》第8周学习总结
- CC254x--API
- Java 添加、更新和移除PDF超链接
- 糖果(信息学奥赛一本通-T1299)
- textbox的textmode取为multiline多行时,其maxlength不起作用
- mysql 回表 覆盖索引_mysql 14 覆盖索引+回表
- Python学习笔记14(socket编程)
- 25 岁的老 Delphi,还值得程序员入手吗?
- matlab中设置拟合初值,如何确定自定义函数拟合时的参数初值?
- 国外大神一张图学会python-没有接触过编程Python难学吗?
- 【leetcode】复写零
- 9.2NOIP模拟题
- 数组去重和两个数组求交集
- [导入]关于:web.config 的配置说明
- windows php_redis.dll 官方下载地址 php5x php7x
- linux下安装oracle instant client,linux下安装Oracle instant client
- 判断一个数字是不是素数
- 如何根据小米12手机电池信息计算充电时间
- [19保研]清华大学交叉信息研究院优秀大学生夏令营
- 7-1 计算存款利息 (10分) 本题目要求计算存款利息
热门文章
- 多年阅读《经济学人》是一种什么体验?
- c#设计12星座速配软件_如何用c#制作一款星座查询软件
- 硬件手册——PT100精密测温电路
- 如何为孩子挑选有益的玩具
- vue 解决安装less插件后出现错误:Analyzer will use module sizes from stats file.
- 八大视频监控软件对比
- 计算机二级常见知识点语言,计算机二级考试语言知识点总结.doc
- 企业大数据战略规划高级培训课程
- 那些职场高手,都是怎么解决问题的?
- 计算机网络系统维护和管理,计算机网络系统维护和管理技术.doc