单调队列
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj1855 [Scoi2010]股票交易(dp+单调队列优化)
dp[i][j]表示第i天结束时手里有j股票的最大利润。则无非三种选择: 1.第i天不交易,则dp[i][j]=dp[i-1][j] 2.第i天买入,则dp[i][j]=max{dp[i-w-1][k]-ap[i]*(j-k)| 1<=j-k<=as[i]} 3.第i天卖出,则dp[i][j]=max{dp[i-w-1][k]+bp[i]*(k-j)| 1<=k-j<=bs[i]} 第i天的原创 2017-09-21 09:13:07 · 444 阅读 · 0 评论 -
bzoj1071 [SCOI2007]组队(枚举+单调队列)
这题我哪会呀。题解:portal原创 2018-04-06 16:06:15 · 220 阅读 · 0 评论 -
bzoj2806 [Ctsc2012]Cheat(SAM+单调队列优化dp)
首先我们建出广义SAM,然后对于每一个询问串S,我们处理出len[i],表示最大的S[i-len[i]+1…i]可以被匹配。我们二分答案,dp判定,f[i]表示前i个字符最多匹配多少位。 f[i]=max{f[i−1],f[j]+i−j|i−len[i]<=j<=i−L}f[i]=max\{f[i-1],f[j]+i-j| i-len[i]<=j<=i-L\} j的取值范围是随着i的增大而单调右原创 2018-04-15 20:14:24 · 253 阅读 · 0 评论 -
bzoj1023 [SHOI2008]cactus仙人掌图(仙人掌dp+单调队列)
真神orz 跪题解:portal有关仙人掌的更多内容,欢迎参见wys2015年的集训队论文~原创 2018-03-31 14:06:37 · 298 阅读 · 0 评论 -
bzoj5185 [Usaco2018 Jan]Lifeguards(dp+单调队列优化)
真是太神了orz 我们先贪心地把被包含的线段删掉,把剩下的线段按左端点排序,这样的话右端点显然也是有序的。设dp[i][k],表示前i个线段,删了k个,且必须保留i线段的最大覆盖长度。枚举上一个线段的位置j,那么我们有转移dp[i][k]=max{dp[j][k−(i−j−1)]+w(i,j)}dp[i][k]=max\{dp[j][k-(i-j-1)]+w(i,j)\} w(i,j)表示把线原创 2018-03-13 11:41:37 · 595 阅读 · 0 评论 -
CF436F Banners(分块+单调队列维护下凸壳)
首先把所有的用户按b升序排序,从小到大枚举c,每次广告的收入是可以直接计算出来的,我们只需要确定一个p,使得p∗(ai>=p的个数)p*(a_i>=p的个数)最大。不难发现,p一定可以等于某个aia_i时取得最优。因此我们按aia_i分块,每一块维护一个下凸壳,记块内的最优位置。每次求最优时就对所有块的最优位置算一个答案然后取max。记d[i]表示p=i时的答案,每次往里加一个点x时,对d的影响是:原创 2018-03-06 07:45:23 · 750 阅读 · 0 评论 -
bzoj1999 [Noip2007]Core树网的核(树的直径+单调队列+贪心)
加强版,n变成了500000.本来的瞎搞法就gg了 怎么办呢?我们需要更高明的瞎搞(逃 首先我们知道两条性质: (1)对于树中的任意一点,距离其最远的点一定是树的直径的某一端点。(2)所有的直径是等价的,即任意一条直径所能求出的最小偏心距相等。于是我们两遍dfs先求出任意一条直径,并记录下来。堵上直径上的所有点,从直径上的每一个点出发遍历他能到达的点,求出不经过直径距它最远的点的距离,记作mx原创 2018-02-25 14:36:38 · 383 阅读 · 0 评论 -
bzoj1758 [Wc2010]重建计划(二分答案+点分治+单调栈)
首先求一个最优比率的东西,我们二分答案,转化成判定是否存在一条合法路径使得边权和≥0.然后这个东西我们点分治去做。每次计算过x的合法路径的最大值时,为了避免不合法,我们一个子树一个子树的做。我们处理出g[i],表示目前这棵子树深度为i的点的最大距离,tmp[i]表示之前做过的子树深度为i的点的最大距离。我们每次用g[i]去询问tmp,也就是要在tmp[l-i,r-i]中选一个最大值,我们发现这就是一原创 2018-01-17 22:38:47 · 809 阅读 · 0 评论 -
bzoj3219 巡游(二分答案+点分治+单调队列)
求中位数最大的路径。我们二分答案,把>=mid的边都变成1,< mid的边都变成-1,如果有一条路径的权值和≥0,则中位数可以为mid。所以我们就是要去找一条权值和最大的路径。具体做法与bzoj1758相同。 我把leoly慢了8s啊,orz原创 2018-01-18 09:08:31 · 392 阅读 · 0 评论 -
bzoj3831 [Poi2014]Little Bird(单调队列优化dp)
f[i]表示跳到i的最小体力。则容易得到转移方程: f[i]=min{f[j]+(a[j]<=a[i])|i−k<=j<i}f[i]=min\{f[j]+(a[j]<=a[i]) |i-k<=j<i\} 由于有(a[j]<=a[i])的存在,看似不能单调队列优化了,其实无妨。。。因为最多只加一。所以在维护单调队列的时候注意如果dp值相等就以a值较大为优即可。原创 2018-01-30 22:40:59 · 331 阅读 · 0 评论 -
CF689B Mike and Shortcuts(单调队列/建图spfa/bfs)
这题做法很多,我太sb了,一直想不出来,看了题解才会。 可以只建i->i+1 i->i-1 i->a[i]三种边,然后spfa或者bfs求单源最短路。 还可以直接从左到右循环,一个点的最短距离只有两种情况,从i-1来,或者从右边某个捷径跳到的点回来,因为ai<=ai+1a_i<=a_{i+1} ,所以还可以用一个单调队列来维护从右边跳回来时的最优值。原创 2017-11-21 09:08:55 · 477 阅读 · 0 评论 -
bzoj1047 [HAOI2007]理想的正方形(单调队列)
如果是一维的,我们可以用单调队列O(n)O(n)解决这个问题,扫一遍求出最小值和最大值,再扫一遍更新答案。二维的同理,我们可以做到O(n2)O(n^2) 先维护出各行的最小值,再维护此时各列(也即此时的矩形区域)的最小值。原创 2017-11-09 15:19:59 · 317 阅读 · 0 评论 -
bzoj1499 [NOI2005]瑰丽华尔兹(dp+单调队列)
这题朴素dp方程应该还是挺好想的。。然后直接朴素dp,O(nmT)写好点就能卡过去了hh。实际上,我们可以用单调队列来优化转移。变成O(nm*k).就是难写的一B。%%%jfy原创 2017-10-29 11:02:16 · 453 阅读 · 0 评论 -
CF487B Strip(单调队列预处理+单调队列优化dp)
这题妙啊。。。堪称优先队列中的典范了啊。。。 首先预处理出L数组,表示右边界为i,左边界最多能扩展到L[i] 。这个过程可以通过两个单调队列和一个指针p解决,分别维护区间最大最小值即可。复杂度O(n) 然后进行dp,dp[i]表示前i个数至少分成几部分,不能分的为inf,考虑转移: dp[i]=min{dp[j]| L[i]-1<=j<=i-l}+1,然而朴素转移是O(n^2)的,显然会T。而原创 2017-10-19 22:06:13 · 588 阅读 · 0 评论 -
bzoj1791 [Ioi2008]Island 岛屿(求基环树直径,单调队列)
给定一个基环树森林,求每一棵基环树的直径,他们的和就是答案。基环树的直径:先找到环,然后直径只有可能是1.环上某一个点的子树的直径2.环上某两个点之间的距离加上他们各自子树中最深的点的深度。然后搜一搜就好了,情况2可以单调队列一下。O(n)O(n)O(n)我写的太丑了,bzoj跑不过去qaq#include <bits/stdc++.h>using namespace ...原创 2019-06-28 11:52:22 · 440 阅读 · 0 评论