堆
EMber _
人但有追求,世界亦会让路。
展开
-
bzoj1724[Usaco2006 Nov]Fence Repair 切割木板
小根堆维护一下就好了。#include <iostream>#include <cstring>#include<cstdio>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;int heap[100001],sz=0;typedef long long ll;int n;inline void put(int y原创 2017-04-14 11:14:51 · 326 阅读 · 0 评论 -
bzoj2006 [NOI2010]超级钢琴 堆+ST表/主席树
题意:Y sera 陷入了沉睡,幻境中它梦到一个长度为N 的序列{Ai}。 对于这个序列的每一个子串,定义其幻境值为这个子串的和,现在Y sera 希望选择K 个不同的子串并使得这K 个子串的幻境值之和最大。 然而由于梦境中的种种限制,这些子串的长度必须在L 到R 之间。 你需要告诉她,最大的幻境值之和。比赛题目的描述直接拿过来用了。 很久之前做的一道题目,所以没有第一时间认出来,而且当时也原创 2017-10-21 16:10:34 · 340 阅读 · 0 评论 -
bzoj1555KD之死 贪心+堆
题意:有一些箱子,有承重和重量,最底下有一个车,有承重限制。 要求最多能放多少个箱子。不能说水,也不能说难的一道题。。 首先肯定知道如果bt-aw>at-bw那么a肯定要在b上面更加优秀,那么按照这个排序以后来贪心做。 如果当前盒子必须要放,那么如果放上去以后超重了,那么把最重的盒子拿出来扔掉再把当前盒子加入。如果堆中没有盒子了则无解。 如果当前盒子不必须要放,那么能放就放,如果这个盒子不能原创 2017-10-29 10:21:33 · 437 阅读 · 0 评论 -
JZOJ5372. 【NOIP2017提高A组模拟9.17】猫 链表+贪心+堆优化
题意:一个长度为n的环,每个点有贡献,取了一个就不能取他的相邻,问取1-n/2个的最优方案是多少。 DP可能会挂,我自己试了试好像会出点问题= =毕竟是环,如果类似这种问题,不能拆环一般就不要DP。 于是考虑贪心,大根堆优化。其实这题可以算是堆优化贪心的典型例题了,每次取完堆顶以后把这个点的贡献改为这个点相邻的两个点的贡献-这个点的贡献,然后把相邻两个删掉,相当于再次取到这个点时就是撤销,就是把原创 2017-09-18 18:10:42 · 549 阅读 · 0 评论 -
bzoj4010 [HNOI2015]菜肴制作 拓补排序+堆
反过来连边,跑拓补序列,用堆维护,然后按照排序的倒序输出就好了。 正确性显然,不懂得话手推一下。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(原创 2017-04-23 09:41:19 · 262 阅读 · 0 评论 -
bzoj3040最短路 road dij+heap
tmd这题的空间卡的我蛋都碎了。。 1e6的点,1e7的边,我开3个1e7的数组就MLE?你tm有本事再开小点? 。。经历了从优先队列——>stl配对堆——>斐波那契堆(手写)——>手写配对堆的过程。。tmd一个dij我写了一晚上我也是醉了。。 最后还是得用hzwer的STL配对堆,,空间能开的再走心一点?#include<iostream>#include<cstdio>#include原创 2017-04-22 21:32:54 · 599 阅读 · 0 评论 -
bzoj1579 [Usaco2009 Feb]Revamping Trails 道路升级 分层图dij+heap
明显裸的分层图,居然还TM要dij+heap,白打半天spfa。。。差评(。 不过熟悉了一下dij+heap好评)。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cstdlib>#include<vector>#include<queue>#define inf 10000原创 2017-05-23 16:08:57 · 399 阅读 · 0 评论 -
bzoj1576[Usaco2009 Jan]安全路径Travel(堆优化dijkstra+并查集)
spfa会被卡。。 思想和3694差不多。 就是最短路树要自己跑dij建出来,其余的基本上一模一样。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) f原创 2017-05-10 22:27:07 · 341 阅读 · 0 评论 -
堆模板
插入:inline void put(node x){ heap[++sz]=x.v; int now=sz; while(now>1&&heap[now>>1]>heap[now]) { swap(heap[now],heap[now>>1]); now>>=1; }}原理比较简单,就是新加入一个点,然后在这个点所在链上维原创 2017-04-14 14:59:22 · 178 阅读 · 0 评论 -
bzoj1572[Usaco2009 Open]工作安排Job 堆
分析:一开始差点看错题了。。 这题我觉得挺不错,,我没有一眼切有点不应该。。堆的应用还不是很熟练啊。。 这个的话,我们按照时间排序,然后每次直接添加进小根堆,如果当前时间小于已经添加的数量,那么明显说明我们要在已经添加的任务中空出来一个位置,那么由于是小根堆,每次添加会自动把最小的放到堆顶,那么我们每次如果有这种情况直接把堆顶拿出来就好了。#include <iostream>#include原创 2017-04-14 14:50:44 · 398 阅读 · 0 评论