对于某类限制选 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这一维即可