
堆
Rem_Inory
这个作者很懒,什么都没留下…
展开
-
【题解】洛谷P1631 序列合并
https://www.luogu.org/blog/user23845/solution-p1631这里我把序号存在结构体里,这样堆里需要比较结构体,重载运算符。#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<que...原创 2018-08-07 20:07:19 · 348 阅读 · 0 评论 -
【题解】洛谷P1801 黑匣子(堆)
怎么求一个堆内的第k小的值呢?我们可以把问题化为两个堆来解决。存一个大根堆一个小根堆,小根堆负责读入元素。a数组记录要读的元素,b数组记录当前位置。读入当前的范围内饱含的元素,并把这个元素放到小根堆里,如果大根堆非空(注意!!!)并且大根堆堆顶比小根堆堆顶要大就交换堆顶,最后输出小根堆堆顶,把它堆顶扔到大根堆里,代表已经找到了第i小的数。关于大根堆里的数是否能更新小根堆上面已经操作过了。...原创 2018-08-07 21:45:57 · 246 阅读 · 0 评论 -
【题解】洛谷P3378 堆(模板)
正式比赛时我们肯定不愿意手写堆,不过作为一道模板题,我们还是手写一下并体会堆的过程比较好。小根堆的存在形式是一棵二叉树,根节点是最小的数。我们初始化树上所有节点的权值为INF。当要添加一个数x时,我们把当前编号+1,把数放在那儿,并记录下当前编号。然后不断将其与其父亲结点进行比较,如果小就交换,并让记录下来的该数的编号除以2。(对于二叉树来说 父亲节点编号为x,那么它两个儿子节点编号必然是x*...原创 2018-08-07 21:58:48 · 681 阅读 · 0 评论 -
【题解】洛谷P2085 最小函数值(堆)
这个题和序列合并非常相似。只不过传的参数多了一点。。想了解思想的可以去我之前博客序列合并那道题看。由于函数系数为正整数,所以对每一个函数来说在正整数范围内都是增函数,知道这一点就可以解决这个问题了。#include<cstdio>#include<iostream>#include<algorithm>#include<queue>...原创 2018-08-07 22:21:24 · 246 阅读 · 0 评论 -
【题解】 洛谷P2278 操作系统(堆)
堆可以很好地实现模拟的一些思路。我们首先要开一个结构体,记录下操作的序号、时间间隔与优先级。接着对堆内大小比较重载运算符,保证每次堆顶都是优先级最大、若优先级相同则是编号更小(更早进入)的元素。然后我们在读入一个新的元素时,需要对当前堆内的每一个元素进行判断。当堆不为空时,用当前的时间加上堆顶元素处理经过的时间,如果比读入的那个元素时间小就把当前时间更新(加上堆顶元素处理时间),输出堆顶元素编...原创 2018-08-08 09:02:52 · 259 阅读 · 0 评论 -
【题解】洛谷P1484 种树(堆)
不难想到这道题需要处理权值最大值,而为了节省时间我们可以用大根堆来解决。贪心的方法是把堆顶元素移除,并标记它与其相邻两个元素不可用,然后在那个位置添加上权值为左边+右边-堆顶值的元素,这样假如我们再找大根堆找到那个新加上的元素,就等效于我们选了第一次那个坑的左右两个坑。具体实现的话我们开结构体,在堆里存下坑的序号与权值。并开数组记录某个坑的权值、某个坑左边那个坑的序号、某个坑右边那个坑的序...原创 2018-08-08 10:35:23 · 280 阅读 · 0 评论