![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
优先队列
DOFYPXY
这个作者很懒,什么都没留下…
展开
-
[BZOJ1455]罗马游戏 左偏树+并查集
左偏树用来合并堆,并查集用来维护所在堆的堆顶编号。 然而有的时候要删除堆顶x,然后对并查集进行这样的操作:fa[x]:=merge(x^.l,x^.r); fa[fa[x]]:=fa[x]。这样就给并查集换了个根。 注意被杀了的点不要真正扔出堆,要不然会影响并查集的getfa,打一个kill标记不管它就是了。 代码:type heap=^heapnode; heapnode=recor原创 2017-04-27 07:48:50 · 335 阅读 · 0 评论 -
[LOJ2274][JXOI2017]加法 二分答案+优先队列
大概思路就是:先二分答案xx,check就是从左往右扫,如果当前值不足xx,就贪心地不断选右端点最右的给它加上,然后用线段树\树状数组维护区间加,或者直接用优先队列维护加的次数即可。 具体地,开两个优先队列Q,HQ,H,前者维护当前可选区间的右端点最大值,后者维护当前已选区间左端点最小值,然后从左往右扫到ii: 1. 把左端点位于ii的区间加入QQ。 2. 把左端点小于ii的从HH里扔掉。原创 2018-01-23 21:56:56 · 854 阅读 · 0 评论 -
[奇技淫巧]带删除的优先队列
这个东西兹磁加入一个数,删除一个数(保证其存在),询问最值。 用两个优先队列实现,一个表示加入的,一个表示删除的,询问时当两个top相同时一并pop掉,直到不相同时就能得到真实答案。 代码:struct heap{ priority_queue<int> Q,D; void push(int x) {Q.push(x);} void erase(int x) {D.pu原创 2018-01-03 22:06:26 · 719 阅读 · 0 评论 -
[BZOJ4382][POI2015]Podział naszyjnika 优先队列+线段树 hash+Twopoints
听说hash做法很简单。。。不管了,我写的是数据结构。。。 以下不要计较开闭区间等等。 考虑从左往右枚举右切口rr,假设左切口ll合法,那么对于每种颜色,要么分布在[1,l]∪[r,n][1,l]\cup[r,n],要么分布在[l,r][l,r]。 对于满足第一种情况的颜色,记precpre_c为其rr在之前最后一次出现的位置,那么要满足l>max{prec}l>max\{pre_c\},可以原创 2018-01-03 22:01:41 · 587 阅读 · 0 评论 -
[2017纪中11-2]字典序 拓扑排序+优先队列
题面 拓扑排序的时候每次取出最小点就是了。。。 代码:#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#include<vector>using namespace std;const int maxn=100010;int n,m,rd[maxn],ans[原创 2017-11-02 19:13:13 · 641 阅读 · 0 评论 -
[2017纪中11-8]购物 贪心+优先队列
题面 这题有点像samjia2000出的三元组。。。 考虑把物品按Qi从小到大排序,那么一定有一个分界点,使得在这个点之前的物品要么买Pi要么买Qi,这个点之后的物品要么买Pi,要么不买(可以想象一下如果之前有一个x不买,之后有一个买Qy,买Qx不买y一定更优)。 于是设s[i]为使用至多k张优惠券买下1~i所有物品(或Pi或Qi)最少需要的钱(经典的二元组问题,强制选某一种然后把两者之差扔进原创 2017-11-10 15:14:11 · 351 阅读 · 0 评论 -
[2017纪中10-22]清兰 贪心+优先队列
题目链接:https://jzoj.net/senior/#main/show/5413 70pts: 使用柯西不等式可以证明均分一定是最优的。 假设两个数的差为 d,那么分为 k 份时对 f(x)的贡献是 分成 k+1 份时,增量为 发现随着 k 的增大,将 k 加一的改进值(增量的相反数)会越来越小,作用越来 越弱。因此,相当于有 n-1 个递减序列,取出不超过 m 个使得它原创 2017-10-23 08:23:28 · 286 阅读 · 0 评论 -
[2017纪中10-21]Fantasy 优先队列+ST表
题目链接:https://jzoj.net/senior/#main/show/5409 原题。。。同NOI2010超级钢琴。 这种求n个集合最大的k的值,考虑先把每个集合中的最大值扔到一个公共堆里,若某个集合最大值还未从堆中取出,那么这个集合中的次大值就没有必要进堆。从堆中不断取k次即可。假设我们很容易得到每个集合的最大值,并且删除最大值很容易得到次大值等等,这个方法就很可行了。 这题先前缀原创 2017-10-23 07:49:33 · 364 阅读 · 0 评论 -
[2017纪中10-28]三元组 贪心+排序/优先队列
题面 考虑 X=0 的时候怎么做,显然是先强制所有都选择 y[i],然后按照 z[i]-y[i]从大到小排序,然后选择前 Z 大的更改为 z[i]。 那么当 X>0 的时候,我们先强制所有都选择 x[i],然后将 z[i]-y[i]从大到小排序,枚举一个 z[i]-y[i]的分界值,选择 z[i]都在分界值以前,选择 y[i]的都在分界值以后,那么可以发现,由于前面已经强制都选择 x[i],那么原创 2017-10-30 07:48:00 · 595 阅读 · 0 评论 -
[BZOJ4010]菜肴制作 拓扑排序+堆
我一开始就理解成求字典序最小的方案。。。然后果断建图拓扑排序,每次删入度为0的点的时候优先删编号最小的点。。。 先说说这种错误的做法,这种做法并不能保证题目中的最优性,比如当前1号点入度不为0,按照要求,应该把能走到1的所有点(限制1的点)都删去再删1,才能保证1最前,但假如此时2号点入度为0,而2并不能走到1,如果先删2就耽误了删1。怎么办呢?我们发现这样只保证了字典序最小,不能满足题目要求,但原创 2017-09-12 22:16:44 · 278 阅读 · 0 评论 -
[雅礼6-30]钟 clock
假设一段时间内没有钟死亡,那么这段时间内每个钟的财产收益都不变,死亡时间也是确定的。 考虑一个钟死亡以后只会对其左右两边的钟的收益,以及死亡时间有影响,所以可以用一个set维护每个钟的死亡时间。每次取出时间最小的那个元素,然后更新它的左右两边。代码:#include<iostream>#include<cstdio>#include<cstring>#include<set>#define原创 2017-06-30 21:18:42 · 424 阅读 · 0 评论 -
[LOJ2275][JXOI2017]颜色 线段树+优先队列
显然,任意一种合法的删颜色的方式都和一对合法的切环的断点一一对应。 然后就和BZOJ4382的第一问一样了。 //反正我就把一个≤\le改成了==就过了 代码:#include#include#include#include#include#include#includeusing namespace std;const int maxn=300010;int n,原创 2018-01-23 22:03:19 · 754 阅读 · 0 评论