![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
堆
文章平均质量分 79
yzyyylx
这个作者很懒,什么都没留下…
展开
-
POJ 2449 Remmarguts' Date(k短路)
题面题意 给出一幅有向图,求出其中的第k短路方法 首先应该想到用BFS加上优先队列,按照距离由短到长进行搜索,当到达终点次数达到k次时停止.代码(错误)#include<iostream>#include<cstdio>#include<cstring>#include<queue>#define ll long long#define P pair<ll,ll>#defin原创 2017-11-07 20:06:07 · 245 阅读 · 0 评论 -
codeforces1119F Niyaz and Small Degrees
题面题意给出一棵有n个点的树,每条边有一个边权,对于[0,n−1][0,n-1][0,n−1]的每一个数x求,至少删掉权值和为多少的边后,所有点的度数都小于等于x.做法首先考虑对于一个x怎么做,记dp[i][2]dp[i][2]dp[i][2]表示第i个点与其父亲之间的边是否删去时,以i为根的子树最小要删去权值和为多少的点,转移时可以用堆处理出所有子节点t中dp[t][1]+val−dp[...原创 2019-04-12 19:54:13 · 457 阅读 · 0 评论 -
codeforces335F Buy One, Get One Free
题面题意你要买n个东西,当你买了一个价格为x的东西时,可以让商店免费赠送你一个价格严格小于x的东西,则你买下这n个东西至少要花多少钱。做法n很大,考虑贪心。首先根据商品的代价从大到小排序,价格相同的商品一起考虑。可以把所有赠送的商品的价格都放到一个小根堆里,当我们考虑价格为x的商品时,记一共有sum个商品的价格比x大,首先将可以送的商品直接赠送(共有min(sum−2∗pq.size...原创 2019-03-03 16:20:22 · 904 阅读 · 0 评论 -
[NOI2017]蔬菜
题面题意有n种蔬菜,每种蔬菜有c[i]的单位,每单位可以获得收益a[i],第一次卖出它可以额外获利s[i],每天会有x[i]个单位过期,每天最多卖出m个单位的蔬菜,k次询问,每次询问给出一个数p,询问用p天最多可以获利多少。做法首先考虑一次询问,则可以将时间倒序来看,这样蔬菜过期就可以看作是这一天将一部分的蔬菜运来,第一次卖也同样额外获利s,然后用优先队列贪心维护最大的m个即可。现在考虑...原创 2019-02-01 09:28:43 · 313 阅读 · 0 评论 -
APIO2018 新家
题面题意在一条路上有n家商店,每个商店有一个类型,在某段时间内在某个位置上存在,每次询问给出一个时间和一个地点,求该时间从该地点出发最少走多少路才可以到达任意一种类型的商店。做法首先可以离线处理,根据时间进行排序,那么没家商店就都可以看作是在某个时间加入,再从某个时间删除,并询问某个点到所有类型点的最小距离的最大值。这个可以进行二分,这样问题就转化为了,询问此时某一段区间内是否存在所有类...原创 2018-12-29 21:56:41 · 512 阅读 · 0 评论 -
SPOJ - QTREE4 Query on a tree IV
题面题意给出一棵树,一开始所有点都是白点,每次一共有两种操作: 1.A,询问两端都是白点的路径的最大长度 2.C,改变某个点的颜色(白改黑或黑改白)。做法算法是树分治,边分和点分都可以。 边分相对要容易很多,因为它每次将树分为两个,统计方便,具体操作就是对于每条边的建两个支持删除某个元素的堆,分别维护这条边的左右两个端点不经过此边和其他边分中心的最大深度,然后再用一个...原创 2018-07-13 12:41:50 · 646 阅读 · 0 评论 -
BZOJ4504 k个串
Description兔子们在玩k个串的游戏。首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次)。 兔子们想知道,在这个数字序列所有连续的子串中,按照以上方式统计其所有数字之和,第 k大的和是多少。Input第一行,两个整数n和k,分别表示长度为n的数字序列和想要统计的第k大的和 接下里一行n个数a_i,表示这原创 2018-03-17 15:50:47 · 387 阅读 · 1 评论 -
Codeforces 913D - Too Easy Problems
题面题意给出n道题目,每个题目有一个a,一个b,需要b时间来完成,并且题目总量小于等于a时,此题有效,一题一分,输出用t时间得到的最高分以及做题方案.做法因为每一题的分值一样,因而可以用贪心来做,先将所有题目按照a从高到低排序(这样排序则扫到后面不需要考虑题目总量是否超过a),之后维护一个按时间排序的大根堆和size,sum记录此时做题数量和花时间的总和,按之前的排序来考虑,每...原创 2018-01-10 09:25:28 · 490 阅读 · 0 评论 -
堆(优先队列)
优先队列简介作用代码优先队列简介 是一个完全二叉树(除最后一行外,其余部分为满二叉树),且父亲永远比孩子大或小。 用一个数组实现i的孩子为i*2和i*2+1,父亲为i/2。作用 1.迅速输出最大值,用pop输出数组的第一位 输出第一个,并把最后一个提上来,并比较使之合法 2.用——.push输入 先加到数组尾,再与父亲比较,过大则交换 3.用——.emp原创 2017-09-08 21:18:07 · 268 阅读 · 0 评论 -
股神小L 2016Vijos省选集训 day1
题面小L厌倦了算法竞赛,希望到股市里一展身手。他凭借自己还行的计算机功底和可以的智商,成功建立一个模型预测了一支股票接下来n天的价格。我们把这支股票第i天的价格称为a_i。在接下来n天里,每一天小L可以选择花费a_i买入一股或者卖出一股从而获得a_i元收入。 当然小L卖出股票的时候,自己的账户上必须要有至少一股的剩余。现在小L希望知道,在n天过去之后,采取最优策略的情况下自己最多赚到多少钱。注意小原创 2018-04-03 13:25:54 · 563 阅读 · 1 评论 -
洛谷 P2048 [NOI2010]超级钢琴
题面题意给出一个序列,求和最大的k个连续子序列的和,且连续子序列长度在l与r之间.做法首先预处理出前缀和,我们可以从左端点开始考虑,若左端点为i,则右端点在i+l-1与i+r-1之间,那么可以计算出这些区间的最大值,然后放到堆里去,每次从堆中取出最大值加到ans中后再将该区间左右两区间的最大值放入堆中. 也就是说我们维护一个结构体(i,l,r,mx)表示左端点为i,右端点在l,r之间的,且这些区间原创 2018-03-16 20:05:40 · 352 阅读 · 0 评论 -
POJ 1475 Pushing Boxes
题面题意 给出一副只有一个箱子的地图,输出路径.没有则输出”Impossible.” 路径要保证箱子移动次数最小,在此条件下,人移动次数最小.方法 因为求最小次数,故用BFS 因为考虑到要箱子移动次优先,而不是人,故直接搜人怎么移动必然会出错 因而我们可以给每次移动加一个权,人移动的代价是1,箱子是1000,并将结果存储在一个优先队列中,这样就能保证箱子移动次数最少,再用原创 2017-11-06 17:43:08 · 343 阅读 · 0 评论 -
Boxes And Balls CodeForces - 884D
题面题意 一开始有一个数,每次可以将一个数分成2或3组,并分别放入一组,代价为这n个数的大小,使最后有n组,并给出每组的数字大小方法 可以看作将n个数合并,每次可以合并2个或3个,代价为几个数的和,最后合并成一个数. 从贪心的角度来看,3个3个合并最优,因为每次可以减少两个数,事实上在奇数个数时确实如此,有偶数个数时,因为最后只剩下了两个数,代价不是最小的,故可以先加一项0,再当奇数原创 2017-11-05 18:08:48 · 371 阅读 · 0 评论 -
poj 2442 Sequence(堆)
题面题意 给出一个m*n的矩阵,每行选择一个数相加,问所得的n个最小值是多少。方法 将所有数一起处理必然会有漏洞,无法保证答案的正确或是时间,故可以一行一行处理,因为多考虑一行后的n个最小数必然由考虑这一行之前的n个最小值与这一行上的一些数相加得到,因而每次只需记录考虑上面几行后的最小值即可,问题就转换为了求两行上一些数相加的所有和中的最小的n个值。 这个问题可以用堆解决,因为两个序原创 2017-11-08 23:22:11 · 256 阅读 · 0 评论 -
codeforces1149D Abandoning Roads
题面题意给出一张无向图,每条边的权值只有两种:a或b(a<b),现在对每个点求,在这张图的所有最小生成树中,1号点到它的最短距离是多少.做法首先在建最小生成树时,权值为a的边比权值为b的边的优先级高,因此可以先将所有边权为a的边缩起来,这样如果权值为b的边连接的点在同一个联通块中,则这条边没有价值.然后我们可以发现,如果一条路径经过某个联通块两次,则这条路径不可能出现在最小生成树上...原创 2019-05-12 21:19:07 · 357 阅读 · 0 评论