对于某类限制选 k k k个的问题,如果 f ( k ) f(k) f(k)是一个凸函数,可以二分切线的斜率,转换成无限制问题,然后根据选了几个调整斜率,使切点横坐标逼近 k k k
有的时候 k k k很小,wqs二分斜率反而会增大常数
P2619 [国家集训队] Tree I
CF125E MST Company
首先判定连通性和合法性, c h e c k ( m i n n ) check(minn) check(minn)
同一类最小生成树选几个特殊边的问题,打表或者感性理解是一个下凸的函数,直接套wqs二分,每次给特殊边附加权,然后重跑一次kruskal
CF739E Gosha is hunting
暴力dp很简单三维 f i , j , k f_{i,j,k} fi,j,k,到第 i i i个精灵,用了 j j j个p球和 k k k个u球的最大期望,每次四种决策,发现当 i , j i,j i,j固定时, f i , j , k f_{i,j,k} fi,j,k中 k k k这一维的函数是上凸函数。将 k k k这一维用wqs二分优化掉,然后每次重新让 f i , j f_{i,j} fi,j去dp
P4983 忘情
先化简式子,每一段的贡献是 1 + s u m 1+sum 1+sum
暴力dp很简单 d p i , j = m a x ( d p i − 1 , k + ( 1 + s u m j − s u m k ) 2 ) dp_{i,j}=max(dp_{i-1,k}+(1+sum_j-sum_k)^2) dpi,j=max(dpi−1,k+(1+sumj−sumk)2),时间复杂度 O ( m n 2 ) O(mn^2) O(mn2),拆开发现可以斜率优化, O ( m n ) O(mn) O(mn)。
考虑 d p i , n dp_{i,n} dpi,n,是一个上凸函数,所以直接套wqs二分,每次用斜率优化 O ( n ) O(n) O(n)求出 d p n dp_n dpn,最终时间复杂度 O ( n l o g k ) O(nlogk) O(nlogk)
P4767 [IOI2000] 邮局
很容易发现位置连续的一些村庄应该由一个邮局管控,那么问题转换为将 n n n个村庄分为 m m m个部分的最小距离和,然后对于一个部分,反证易得邮局应该放在中间的村庄。
暴力dp f i , j = f i − 1 , k + w j + 1 , k f_{i,j}=f_{i-1,k}+w_{j+1,k} fi,j=fi−1,k+wj+1,k
w j + 1 , k = ( 2 m i d − i − j ) ∗ a m i d + s u m i + s u m j − 2 ∗ s u m m i d − k w_{j+1,k}=(2mid-i-j)*a_{mid}+sum_i+sum_j-2*sum_{mid}-k wj+1,k=(2mid−i−j)∗amid+sumi+sumj−2∗summid−k 其中 ( m i d = i + j + 1 > > 1 ) (mid=i+j+1>>1) (mid=i+j+1>>1) 发现这个 m i d mid mid很烦人,不然可以向上一题一样斜率优化直接优化到 O ( n m ) O(nm) O(nm)
一:四边形不等式优化 见四边形不等式优化dp
二:发现 f i , n f_{i,n} fi,n是一个下凸函数,wqs二分优化即可
P3620 [APIO/CTSC2007] 数据备份
CF958E2 Guard Duty (medium)
排序,贪心每段一定只有两个数,很容易想到dp
f i , j = m a x ( f i , j − 1 , f i − 1 , j − 2 + a j − a j − 1 ) f_{i,j}=max(f_{i,j-1},f_{i-1,j-2}+a_j-a_{j-1}) fi,j=max(fi,j−1,fi−1,j−2+aj−aj−1) 时间复杂度 O ( k n ) O(kn) O(kn)
发现 f i , n f_{i,n} fi,n是一个下凸函数,直接wqs二分优化即可
P4383 [八省联考 2018] 林克卡特树
如果只关注怎么断边,很不好切入变成树上问题。发现其实断 k k k条边,再任意连边,会先形成 k + 1 k+1 k+1个连通块,然后连接他们的直径
f u , i f_{u,i} fu,i表示以 u u u为根的连通块中,有 i i i条链,经过 u u u的最长链的最大值,发现不好转移,比如将儿子 v v v合并时,如果儿子最长链是一个以 v v v为中间节点的链,或者 u u u的最长链是一个以 u u u为中间节点的链。
所以增加一维表示当前最长链中, u u u的度数为多少
f u , i , 0 / 1 / 2 f_{u,i,0/1/2} fu,i,0/1/2,然后转移就很好写了,两种决策,合并到 u u u中 / / / 单独作为一个连通块
发现随着 f i f_i fi是一个上凸函数,先增后减,所以wqs二分优化掉 i i i这一维即可