决策单调性
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj1597 [Usaco2008 Mar]土地购买(变形+斜率优化)
一开始的题目,只是给我们n块随机的地,让我们分组,可以往的1D1D形式的dp一般都会要求每组中序号都是连续的,这样我们才可以进行dp。那此题怎么办呢?首先有个显然的优化:如果x1<=x2&&y1<=y2则(x1,y1)完全可以和(x2,y2)打包在一起购买而不用付出额外的花费,因此(x1,y1)就可以不再考虑了。所以我们把所有的地按x为第一关键字,y为第二关键字进行升序排序,把可以和别的地“打包”购原创 2017-08-07 17:54:27 · 383 阅读 · 0 评论 -
poj1160 [IOI2000] Post Office(区间dp+四边形不等式)
首先求出在第i个到第j个村庄中只建立一个邮局的最优距离,用数组dis[i][j]表示。dis[i][j]=dis[i][j-1]+a[j]-a[(i+j)/2]; (村庄位置为a[i])显然邮局建在中心a[(i+j)/2]最优,如果有两个,建在哪个中心都可以。画画图就可以理解了。然后用数组dp[i][k]表示在前i个村庄中建立k个邮局的最小距离。则 dp[i][k]=min{dp[j][k−1]+原创 2017-08-05 15:55:20 · 524 阅读 · 0 评论 -
bzoj2216 [Poi2011]Lightning Conductor(决策单调性+分治/二分+单调栈)
化简一下就是求ans[i]=max{aj+|i−j|−−−−−√}−a[i]ans[i]=max{aj+|i−j|}−a[i]ans[i]=max\{a_j+\sqrt{|i-j|}\}-a[i]我们把绝对值去掉,正着倒着各做一遍即可。现在只考虑&lt;i&lt;ijjj设k1&lt;k2&lt;ik1&lt;k2&lt;ik_1ak1+i−k1−−−−−√&lt;ak2+i−k2−−原创 2018-07-02 21:56:10 · 681 阅读 · 0 评论 -
bzoj4709 [Jsoi2011]柠檬(贪心+dp+决策单调性+单调栈)
问题就是把这个序列分成若干段,使得每段的贡献和最大。 首先我们贪心地发现每段的起终位置一定相同(否则分出去更好) 于是有dp,f[i]表示前i个的最大贡献。枚举i这一段的起点j,一定满足a[i]==a[j],记c[i]表示i及i之前出现了多少个a[i] f[i]=maxj=1i{f[j−1]+a[i]∗(c[i]−c[j]+1)2|a[j]==a[i]}f[i]=maxj=1i{f[j−1]...原创 2018-06-21 15:12:42 · 347 阅读 · 0 评论 -
bzoj5311 贞鱼(dp+决策单调性+wqs二分)
首先我们有朴素dp f[i][k]f[i][k]f[i][k]表示把前i个分成k段的最小代价 f[i][k]=minj=0i−1{f[j][k−1]+w(j+1,i)}f[i][k]=minj=0i−1{f[j][k−1]+w(j+1,i)}f[i][k]=\min\limits_{j=0}^{i-1}\{f[j][k-1]+w(j+1,i)\} 其中w(i,j)w(i,j)w(i,j)表示...原创 2018-06-21 12:02:56 · 840 阅读 · 0 评论 -
bzoj2739 最远点(凸包+决策单调性+分治)
给定一个凸包,询问每个点距离最远的点的标号。 我们按逆时针考虑每一个点i,距离i最远的点j也是在逆时针转的。 因此我们可以把这个凸包拆成链,(把点再复制一次),每个点i合法的点的区间为[i,i+n]。其余点到i的距离为-inf。这样我们就有决策单调性了,随着i的增大j也是单增的。因此我们可以直接分治求。复杂度O(nlogn)O(nlogn)O(nlogn)#include <bits...原创 2018-07-02 23:05:53 · 718 阅读 · 0 评论 -
bzoj2369 区间(贪心+dp+决策单调性+分治)
首先我们可以贪心地发现,肯定是取两个区间,对于包含的区间肯定不如选最大的那个,因此把被包含的都去掉,但是要注意更新答案哟。 好了,我们只剩下一堆l,r都单增的区间了,我们考虑区间i,他的最优决策为wi(wi< i),我们可以发现wi是单调不降的。于是我们可以分治+决策单调性来做。 复杂度O(nlogn)O(nlogn)原创 2018-04-24 19:47:19 · 515 阅读 · 0 评论 -
bzoj2726 [SDOI2012]任务安排(cdq分治+斜率优化)
我们显然有n^2 dp f[i]=min{f[j]+(S+t[i]−t[j])∗w[j]}f[i]=min{f[j]+(S+t[i]−t[j])∗w[j]}f[i]=min\{f[j]+(S+t[i]-t[j])*w[j]\} 其中t[i]=∑j=1iT[i],w[i]=∑j=i+1nF[j]t[i]=∑j=1iT[i],w[i]=∑j=i+1nF[j]t[i]=\sum\limits_{j=...原创 2018-07-03 12:30:11 · 362 阅读 · 0 评论 -
bzoj1531 [POI2005]Bank notes(单调队列优化多重背包)
单调队列优化多重背包的板子。 我们朴素的多重背包做法是O(m∑c)O(m∑c)O(m\sum c)的 可以用二进制优化成O(m∑logc)O(m∑logc)O(m\sum logc) 更进一步的,我们可以用单调队列优化成O(nm)O(nm)O(nm) 考虑转移方程 f[j]=max{f[j−k∗v[i]]+k∗w[i]|0≤k≤c[i]}f[j]=max{f[j−k∗v[i]]+k∗w[...原创 2018-07-03 16:40:08 · 789 阅读 · 0 评论 -
bzoj3163 [Heoi2013]Eden的新背包问题(分治+背包dp)
每次询问去掉物品i之后,j的钱最多可以买多大价值的东西。 我们可以分治[l,r]表示l~r的物品不买的背包数组。然后递归处理[l,mid]时把[mid+1,r]的物品转移进来,递归处理[mid+1,r]时把[l,mid]的物品转移进来。转移的时候就是一个多重背包,可以单调队列优化。 复杂度O(nmlogn)O(nmlogn)O(nmlogn)#include <bits/stdc...原创 2018-07-03 17:01:29 · 684 阅读 · 0 评论 -
bzoj1563 [NOI2009]诗人小G(dp+决策单调性+二分)
首先有很显然的O(n2)O(n2)O(n^2)dp f[i]=min{f[j]+|s[i]−s[j]+i−j−1−L|p}f[i]=min{f[j]+|s[i]−s[j]+i−j−1−L|p}f[i]=min\{f[j]+|s[i]-s[j]+i-j-1-L|^p\} 30分。 然后考虑p=2的,化一下式子可以发现是个斜率优化。 20分。 考虑4,5两个L非常小的点,可以贪心,每行如果放...原创 2018-07-03 21:29:57 · 371 阅读 · 0 评论 -
【UNR #3】Day1
A(70)#include &lt;bits/stdc++.h&gt;using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 200010inline char gc(){ static char buf[1&lt;&lt;16],*S,*T; if(T==S){T=(S=buf)...原创 2018-07-13 16:31:01 · 358 阅读 · 0 评论 -
luogu1880 合并石子(区间dp)
环形石子堆,我们首先要拉成直链(在后面复制一遍即可)。然后区间dp,dp1[i][j]表示合并第i到j堆的最小得分。最后答案就是min{dp[i][i+n−1]}(1≤i≤n)min\{dp[i]\left[i+n-1\right]\}(1\leq i\leq n).最大得分同理。时间复杂度O(n3)O(n^3)原创 2017-07-29 17:21:51 · 373 阅读 · 0 评论 -
uoj240【IOI2016】aliens(斜率优化dp+wqs二分)
这是强行交互么qaq 我们可以把所有点都对称到主对角线下方。 然后每个点如果想被覆盖都会有一个最小的三角形,我们可以贪心的只留必须选的点。如果把剩下的点按x坐标升序排序,可以发现他们的y坐标也是升序排序的。记剩余点个数为n,显然每个点都选自己的最小三角形最好。但是有可能n>K,即我们不得不合并一些连续的最小三角形。可以dp,f[i][k]表示覆盖前i个点,用了k个三角形的最少覆盖点。...原创 2018-05-16 22:50:31 · 1251 阅读 · 0 评论 -
bzoj3672 [Noi2014]购票(dp+斜率优化+点分治+cdq分治)
首先考虑如果是序列怎么做,比较明显的dp,dp[i]表示i走到1的最少花费,则 dp[i]=min{dp[j]+(dis[i]−dis[j])∗p[i]+q[i]|j<i,dis[i]−dis[j]<=li[i]}dp[i]=min\{dp[j]+(dis[i]-dis[j])*p[i]+q[i] |j<i,dis[i]-dis[j]<=li[i]\} 我们自然想到斜率优化,我就不推式子了qaq原创 2018-01-18 13:40:52 · 371 阅读 · 0 评论 -
CEOI 2004 two 锯木厂(cogs)(斜率优化)
Description 从山顶上到山底下沿着一条直线种植了n棵老树。当地的政府决定把他们砍下来。为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂。 木材只能按照一个方向运输:朝山下运。山脚下有一个锯木厂。另外两个锯木厂将新修建在山路上。你必须决定在哪里修建两个锯木厂,使得传输的费用总和最小。假定运输每公斤木材每米需要一分钱。 你的任务是编写一个程序,从输入文件中读入树的个数和原创 2017-08-05 20:37:20 · 662 阅读 · 0 评论 -
bzoj3437小P的牧场(斜率优化)
这题就是锯木厂那道的简化版。。只不过是每个点之间的距离都变成1了。。详见锯木厂。f[i]=min{f[j]+c[i]-c[j]-sw[i]*(i-j)| 0<=j< i}+a[i]。表示在i建控制站,上一个控制站建在j所需的最小花费。假设k1< k2且k1优于k2,则有(f[k2]-f[k1]+c[k1]-c[k2]+sw[k2]*k2-sw[k1]*k1)/(sw[k2]-sw[k1])>i。因此原创 2017-08-08 14:57:18 · 335 阅读 · 0 评论 -
bzoj4518 [Sdoi2016]征途 (斜率优化)
求方差的套路见过了,所以直接A掉了hh 答案表示一下就是∑i=1m(x¯−xi)2m∗m2\frac{\sum\limits_{i=1}^m(\overline{x}-x_i)^2}{m}*m^2,其中x¯=∑i=1mxim\overline x =\frac{\sum\limits_{i=1}^mx_i}{m},记前缀和sum,则sum[n]显然就是∑i=1mxi\sum\limits_{i=1原创 2017-08-08 17:38:07 · 384 阅读 · 0 评论 -
bzoj3675 [APIO2014] 序列分割(斜率优化)
首先我们根据这个分割的过程可以发现:总得分等于k+1段两两的乘积的和(乘法分配律),也就是说与分割顺序是无关的。再对乘积进行重分组(还是乘法分配律)我们可以转化为:ans=∑第 i 段×前 i-1 段的和,那我们可以认为这k+1段是从左到右依次分出来的。假设目前这段是j+1…i,则他对答案的贡献为(sum[i]-sum[j])*sum[j].这样就很容易可以得到O(kn2)O(kn^2)的状态转移方原创 2017-08-08 16:24:31 · 371 阅读 · 0 评论 -
[noi模拟赛]math (斜率优化,未测)
拖了许久的坑。。 sum[i]=∑t=1ia[t]sum[i]=\sum\limits_{t=1}^ia[t] sum1[i]=∑t=1i1a[t]sum1[i]=\sum\limits_{t=1}^i\frac{1}{a[t]} sum2[i]=∑t=1isum[t]a[t]sum2[i]=\sum\limits_{t=1}^i\frac{sum[t]}{a[t]} f[i][k]前i个数原创 2017-08-08 22:35:19 · 319 阅读 · 0 评论 -
bzoj1492 [NOI2007]货币兑换Cash(斜率优化+CDQ分治)
这个大坑,终于填上了=,= 首先理论来自论文,点此查看 题目很长。。耐心读。。首先我们注意到这句话: **必然存在一种最优的买卖方案满足: 每次买进操作使用完所有的人民币;每次卖出操作卖出所有的金券。** 分析一下这句话:首先是卖出假设我们手中有一堆A券和一堆B券 选择在一些天数分天卖出,那么这些天中一定有一天,卖出同样比例的证券可以获得的钱最多,我们选择这一天全部卖出 一定比分天卖出更优原创 2017-08-11 19:27:51 · 370 阅读 · 0 评论 -
poj2018 Best Cow Fences(直接求斜率)
这道题算是给斜率优化dp打下一个基础。题目要求的平均值,用前缀和表示的话就是ave(i,j)=Sj−Si−1j−(i−1)ave(i,j)=\frac{S_j-S_{i-1}}{j-(i-1)},如果将S函数绘在平面直角坐标系内,这就是过点Sj和点Si-1直线的斜率!于是问题转化为:平面上已知N+1 个点,Pi(i, Si),0≤i≤N,求横向距离大于等于F的任意两点连线的最大斜率。构造下凸曲线,用原创 2017-08-05 18:17:26 · 758 阅读 · 1 评论 -
bzoj1096 [ZJOI2007]仓库建设(斜率优化)
基本和锯木厂一样。dp[i]表示在i建一个锯木厂的最优方案。则 dp[i]=min{dp[j]+c[i]-c[j]-sw[j]*(sd[i]-sd[j]}+w[i]。 具体见锯木厂。原创 2017-08-05 21:04:09 · 361 阅读 · 0 评论 -
bzoj1911 [Apio2010]特别行动队(斜率优化)
f[i]表示前i个人能获得的最大战力。 f[i]=max{f[j]+w(j+1,i)|1<=j< i}.w(j+1,i)表示j+1…i组成一队获得的战斗力,把sum[i]-sum[j]代入公式即可。如果k1< k2且k1优于k2: f[k1]-f[k2]+a*sum[k1]^2-a*sum[k2]^2+b*(sum[k2]-sum[k1])>2*a*(sum[k1]-sum[k2])*sum[i原创 2017-08-05 21:27:09 · 313 阅读 · 0 评论 -
bzoj1010 [HNOI2008]玩具装箱toy(斜率优化)
f[i]表示a[1]+…+a[i]+i。为了方便处理。。。dp[i]表示把前i件压缩需要的最少费用。则dp[i]=min{dp[j]+(f[i]−f[j]−c)2|1≤j<i}dp[i]=min\{dp[j]+(f[i]-f[j]-c)^2|1\leq j< i\} 若k1< k2且k1优于k2,则: (dp[k2]+(f[k2]+c)2−dp[k1]−(f[k1]+c)2)/(2∗(f[k2]原创 2017-08-05 21:45:13 · 347 阅读 · 0 评论 -
bzoj3156 防御准备(斜率优化)
比较标准的斜率优化。。。题目中描述的是需要我们倒着做。。多别扭啊对不对。。。我们把w[i]反过来记就好了。。这样从小往大做就舒服多了。。。f[i]表示在第i个位置建塔,使得前面所有位置都安全所需的最小花费。 f[i]=min{f[j]+(i−j)∗(i−j−1)/2|1≤ji}+w[i]f[i]=min\{f[j]+(i-j)*(i-j-1)/2|1\leq j (枚举离i最近的塔建在位置j,原创 2017-08-07 20:50:15 · 384 阅读 · 0 评论 -
bzoj4850 [Jsoi2016]灯塔(决策单调性)
同bzoj2216#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 500010inline char gc(){ static char buf[1<<16],*S,*T; if(S==T){T=(S=...原创 2018-07-07 21:59:11 · 710 阅读 · 0 评论