堆排序算法就是通过维护一个小根堆或者大根堆的数据结构。小/大根堆本质上是一个完全二叉树。利用了完全二叉树的性质,即完全二叉树节点x的子节点编号为2x和2x+1。 利用这个性质,我们可以让一个一维数组来模拟这个二叉树,数组下标从1开始建立,下标为2*x和2*x+1的就是x的左子树和右子树。 #incl ...
分类:
编程语言 时间:
2020-02-08 17:57:21
阅读次数:
130
"题目链接www" 仔细观察我们会发现以下规律 固定 A[i], 每 n 个和都是有序的: A[1] + B[1], A[1] + B[2], …, A[1] + B[n] A[2] + B[1], A[2] + B[2], …, A[2] + B[n] … A[n] + B[1], A[n] + ...
分类:
其他好文 时间:
2020-01-30 12:57:18
阅读次数:
71
思路与 "中位数" 一题,解决方案比较像,使用对顶堆来解决。 具体实现为,使用两个堆,大根堆维护较小的值,小根堆维护较大的值,即小根堆的堆顶是较大的数中最小的,大根堆的堆顶是较小的数中最大的。 将大于大根堆堆顶的数(比所有大根堆中的元素都大)的数放入小根堆,小于等于大根堆堆顶的数(比所有小根堆中的元 ...
分类:
其他好文 时间:
2020-01-22 23:47:49
阅读次数:
88
考虑用$DP$和组合数学来解决。 因为原图像不规则的形状不好处理,所以先用笛卡尔树(性质为小根堆)将其划分成一个一个的矩形。 发现在笛卡尔树上的每个节点都对应一个矩形,矩形高为$h_x h_{fa_x}$,宽为$size_x$。 结合笛卡尔树的性质,不难得到,红色矩形所对应的节点的两个儿子为绿色矩形 ...
分类:
其他好文 时间:
2020-01-22 23:45:01
阅读次数:
63
dfs时,用可并的小根堆去维护所有活下来的骑士;更新时就直接往外弹即可;然后堆上要维护乘法和加法标记。 2020.01.18 ...
分类:
其他好文 时间:
2020-01-19 19:14:14
阅读次数:
49
题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入格式 第一行包含一个整数N,表示操作的个数 接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下: 操作1: 1 ...
分类:
其他好文 时间:
2020-01-17 09:22:17
阅读次数:
81
目录 堆的概念要点算法分析 堆排序算法的总体情况 时间复杂度 算法稳定性完整参考代码 JAVA版本参考资料相关阅读 说明 堆的概念 在介绍堆排序之前,首先需要说明一下,堆是个什么玩意儿。 堆是一棵顺序存储的完全二叉树。 其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。 其中每个结 ...
分类:
编程语言 时间:
2020-01-16 10:30:47
阅读次数:
70
头条算法一面,记录一下 实现优先级队列(小根堆) 1 class prioQueue: 2 def __init__(self, elist=[]): 3 self._elems = list(elist) 4 if elist: 5 self.buildheap() 6 def siftdown( ...
分类:
其他好文 时间:
2020-01-02 20:34:22
阅读次数:
85
https://www.acwing.com/problem/content/description/150/ 哈夫曼树可以通过小根堆实现。小根堆每次弹出两个值,然后将二者的和再插入小根堆中。 比如求 ...
分类:
其他好文 时间:
2019-12-20 12:19:23
阅读次数:
77
1, 我记得以前好像还想好好搞来着..... 什么大根堆什么小根堆来着? 2 抄自ppt 很多种实现优先队列的方式,最常见的就是堆。 最常见的堆就是二叉堆,C++中priority_queue定义了一个以权值为优先级的堆。 #include<queue> priority_queue<数据类型> q ...
分类:
其他好文 时间:
2019-12-14 21:27:35
阅读次数:
92