![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构-堆
Endless_Way
这个作者很懒,什么都没留下…
展开
-
BZOJ 1029 [JSOI2007]建筑抢修
贪心,根据t2从小到大排序,用堆维护。·剩余时间足够完成当前任务,则插入当前任务 ·剩余时间不足完成当前任务,若当前任务的t1比堆中t1的最大值大,则不插入,否则插入#include<cstdio>#include<algorithm>#define MAXN 150010struct pro{int t1, t2;}p[MAXN];using namespace std;bool cm原创 2016-08-01 13:37:11 · 275 阅读 · 0 评论 -
BZOJ 1095 [ZJOI2007]Hide 捉迷藏
点分治模板题练习借(抄)鉴(袭)了这一篇:http://blog.csdn.net/popoqqq/article/details/44461423思想是通过重心与子重心连边,形成logn高度的树,所以更新节点只需要logn的复杂度。用堆维护。代码有点长,打了一点注释以后方便理解- -#include<queue>#include<cstdio>#include<algorithm>#defi原创 2016-08-09 17:26:28 · 291 阅读 · 0 评论 -
BZOJ 1724 [Usaco2006 Nov]Fence Repair 切割木板
合并果子裸题每次选取最小的两个合并即可证明:把合并过程画成哈夫曼树,如果最小点的兄弟不是次小点,把次小点和最小点的兄弟换一个位置答案肯定不会更劣。也就是记次小点i,最小点的兄弟j,点到根的距离为d,点权为w 由 w[i]<w[j],d[i]<d[j]w[i]<w[j],d[i]<d[j] 一定有 d[j]∗w[j]+d[i]∗w[i]>d[j]∗w[i]+d[i]∗w[j]d[j] * w[原创 2016-09-25 12:42:48 · 384 阅读 · 0 评论 -
BZOJ 3689 异或之
TRIE树+堆如果只求最小的,我们可以建出TRIE树,对每一个数都跑一边求第二小(最小的是自己异或自己),这样一定包含了所有数的异或最小值,然后找最小的即可。如果还需要求第二小,在排除第一小的情况下,我们把组成第一小的那个数在TRIE树上求一个第三小,这样同样依然包含了所有数的当前异或最小值,以此类推,堆维护即可。注意a^b = b^a,也就是说一个值会出现两次,所以k应取k*2#include<c原创 2016-10-22 10:11:36 · 304 阅读 · 0 评论 -
BZOJ 3832 [Poi2014]Rally
拓扑排序+堆暴力的做法是枚举删掉哪一个点,然后DP出删掉这个点之后的最长链长度。那么我们来挖掘一下删点之后的最长链的性质。记删点为x,记所有能走到x的点集为S1, 所有x能走到的点集为S2,注意到最长链上可能存在一些点属于S1或S2,同时也一定存在一些点既不属于S1,也不属于S2!(反证法)于是我们考虑能不能通过这些既不属于S1也不属于S2的点来找到当前最长链,这启发我们应该把最长链信息记录在中间,原创 2016-11-09 11:02:24 · 316 阅读 · 0 评论 -
BZOJ 1367 [Baltic2004]sequence
左偏树左偏树论文题。左偏树的优越性在于它可以不断找出树高最短的一段,因此能一直保持O(logn)的合并复杂度。对于这题,先转成不降序列来做,只需-i我们将序列先分成n段,则每一段的最优解z[i]=t[i],从左到右一段一段做,考虑合并。若z[i] <= t[i],不需要合并。去做下一段。若z[i] > t[i],易证(感性地想,或者去看论文)两段的最优解应当是两段所有数字的中位数。于是合并两段并改最原创 2016-12-03 16:58:25 · 286 阅读 · 0 评论 -
BZOJ 2809 [Apio2012]dispatching
可并堆如果固定了管理者,那一定是贪心地选取子树内最小的若干个。因此用大根堆维护子树值,满足总和小于m,然后合并给父亲。#include<cstdio>#include<algorithm>#define N 100005#define ll long longusing namespace std;namespace runzhe2000{ int n, m, fa[N], mo原创 2017-01-20 23:34:46 · 268 阅读 · 0 评论 -
UOJ 205 [APIO2016]Fireworks
可并堆+凸包首先猜一个结论,这玩意儿的函数是下凸的,进一步再猜这玩意儿是一个连续的分段一次函数,来证明一发。要证明一个子树的函数是下凸的分段一次函数,只需证明 ①所有子树加上父边之后还是下凸的分段一次函数 ②加上父边的子树合并起来还是下凸的分段一次函数 这两个显然正确(强行偷懒),详见WMD的题解《Firework》然后。。。看代码吧#include<cstdio>#include<alg原创 2017-02-13 19:12:57 · 782 阅读 · 0 评论