
堆
文章平均质量分 61
数据结构---堆
(xsj)
模拟只会猜题意
贪心只能过样例
DP一般看规律
数论只会gcd
计算几何瞎暴力
图论只会匈牙利
数据结构没学过
字符串只能干输入
展开
-
算法竞赛进阶指南---0x18(对顶堆) Black Box
题面题解我们可以用对顶堆来维护一个有序的序列,如图我们只要维护大根堆中的元素是i-1个,那么小根堆的堆顶就是按升序排序后的第i个数,接下俩看两个操作对于GET操作,先让i++,然后输出排序后的第i个数,但是题中给定的数组是先输出,后i++(看题),那么我们每次先输出right(小根堆)的堆顶,然后i++,那么left(大根堆)中的元素就应该加+1,我们只需要将小根堆的堆顶放入大根堆中即可维护对于ADD操作,如果插入的这个a[i]>=right.top||left.e原创 2021-03-02 11:21:02 · 134 阅读 · 0 评论 -
算法竞赛进阶指南---0x17(二叉堆) 数据备份
题面题解假设选一段,肯定是选最小的;那么选两段呢,就有两种情况,第一种是不破坏34节点,再选一段34节点以外的,第二种就是破坏34节点,那么我们就要选23和45了,为什么选连续的两段呢,假如我们只选了23,然后选择67,那么破坏34就没有必要,因为34是最小的,所以只要是破坏34,就一定是选23,45 当然,对于n段也是一样的。那么如何计算破坏一段连续的区间之后的值呢,通过推导可以发现,每次增加的值就是将两边的值 - 这段连续区间的值代码...原创 2021-02-19 21:26:17 · 172 阅读 · 0 评论 -
算法竞赛进阶指南---0x17(二叉堆)荷马史诗
题面题解哈夫曼树的应用,要求合并之后的权值最小,而且要高度尽可能的小对于每次合并k个数,肯定是每次选择最小的k个数进行合并,如图,处于最底层的数贡献的权值是最多的,既然我们想要最后的权值最小(次数一定),那么肯定是让权值小的贡献次数多,权值大的贡献次数少,这就是哈夫曼树,但是对于每次合并k个,我们就有可能出现图中情况,就是合并到最后一层不够k个数,那么这样操作就不是最小的,因为我们把节点1,2,3,4,5任何一个移动到最后一层都比当前的权值小,但是我们可以将哈夫曼树补满,就是将节点的个数原创 2021-02-18 19:47:35 · 185 阅读 · 0 评论 -
算法竞赛进阶指南---0x17(二叉堆)序列
题面输入样例12 31 2 32 2 3输出样例3 3 4题解模拟样例,直接看图我们这样的答案最终有 nm 种,但是我们只用关心前n个小的数即可,那么我们就可以逐行归并,就是总共会有m行,每行有n个数,对于前两行,我们会找出 n2 种答案,因为我们只需要前n个数,那么我们就保留答案的前n个数,然后用这n个数继续和第三行合并,最终合并 m-1 次 就会的到最终的结果,也就是最小的n个数那么如何合并两行并找出前n个小的数,暴力枚举,O(n2) *(m-1)原创 2021-02-16 23:20:04 · 222 阅读 · 0 评论 -
算法竞赛进阶指南---0x17(二叉堆)超市
题面输入样例4 50 2 10 1 20 2 30 17 20 1 2 1 10 3 100 2 8 25 20 50 10输出样例80185题解我们可以用一个小根堆来维护一个利润最大的集合,将所有产品按保质期从小到大排序,每次加入商品,判断集合中的商品是否满足在保质期能否卖出,不满足就从堆顶删除一个元素(堆顶就是利润最小的元素)这样每次在极限的情况下删除最小的利润,在不过期的情况下集合中所保证的就是利润最大代码#include<原创 2021-02-10 17:22:39 · 217 阅读 · 0 评论 -
算法竞赛进阶指南---0x17(二叉堆)合并果子
题面题解对于给定的数据,我们进行模拟,如果第一次合并 1 +2 = 3 ,第二次合并 3 + 9 =12 ,消耗的总体力值是 1 + 2 + 1 + 2 + 9 = 15我们换一种合并方式 :第一次合并 1 + 9 =10 ,第二次合并 10 + 2 = 12 ,消耗的总体力值是 1 + 9 +1 + 9 + 2 = 22继续换一种方式 : 第一次合并 2 + 9 = 11 ,第二次合并 11 +1 =12 ,消耗的总体力值是 2 + 9 + 2 + 9 +1 =234.观察发现,每原创 2021-02-10 12:12:04 · 207 阅读 · 0 评论 -
acwing 839 模拟堆
题面题解(手写小根堆)down 操作 :向下更新,将父节点和两个子节点比较,值小的作为父节点,然后递归更新up 操作 :向上更新 ,将此节点与其父节点比较,如果此节点的值小于父节点,就交换位置,然后继续向上更新“I x”,插入一个数x; 只需要在堆的最后插入一个数,然后up“PM”,输出当前集合中的最小值; 只需要返回序列中的第一个元素“DM”,删除当前集合中的最小值(数据保证此时的最小值唯一); 就是删除堆顶元素,我们可以让堆里的最后一个元素,将堆顶元素覆盖,再将新的堆顶元原创 2021-02-10 11:38:12 · 261 阅读 · 0 评论 -
codeforces 1466 D 13th Labour of Heracles (大根堆,图染色)
题面题意t 组样例,每组 n 个点,每个点上有权值,然后n-1条边把点连起来构成图(题中说是树)有多种颜色可以给图中每条边染色( n-1条边最多染 n-1 种颜色),问染i种颜色,图的最大权值是多少最大权值的计算 :删去所有颜色不为i的边之后,图中每个点数>1的连通块点权和的最大值。定义图的权值为 i 种颜色的权值和。题解题目有点唬人啊,其实超级简单,读不懂题的多看几遍,或者看样例 ,还有注意数据范围 long long我们先模拟一遍样例可以发现,当只有一种颜色时,肯定原创 2021-02-02 13:42:07 · 256 阅读 · 1 评论