前置芝士

基础二分+基础DP

算法流程

wqs二分是一个神奇的东西,经常用来把限制条件转化为二分来降低时间复杂度。

常见类型:在满足A物品强制选择了m个情况下总价值最大

如果不考虑 选择了m个 这个条件,我们只考虑总价值最大,我们能够得到一个时间复杂度比较优秀的算法。

现在考虑二分一下A物品的额外代价(可正可负),修改A的代价后重新进行刚才的算法,顺便记录一下价值最大的情况下选择了多少个A。

然后根据选择了多少个A来调整二分边界。

最后最优情况是选择k个A时,我们把额外代价删去就是正确代价

很多时候需要二分到小数,而且需要卡精度, 正确性有的时候还需要多考虑考虑。

证明

这个大佬证明的很详细

当然你也可以看一下我这个(滑稽)

设g(i)是选i个A的最优总价值,i为横坐标,g(i)为纵坐标作图。

我们要求的是g(m)

我们二分的就是直线斜率k(就是额外代价,至于为啥先往下看),如下

wqs二分/带权二分/凸优化 详解_斜率

当k合适时,只有被切点为m,直线截距最大,设截距为f(i)

f(i)=g(i)-ki,如下图

wqs二分/带权二分/凸优化 详解_斜率优化dp_02

把ki分配到i个物品上,就相当于给每个物品附加上了k的额外代价

很容易就能求出f的最大值

g(i)=f(i)+ki,我们根据f(i)取最大值的时候的i和m的大小调整二分

练习题

题单

P2619 [国家集训队]Tree I挺简单一道题,这道题貌似可以通过一些神奇操作不用二分到小数,但我看不懂证明(跪了)

P4983 忘情

一顿操作猛如虎,一化式子二百五,wqs二分+斜率优化DP,不会斜率优化DP的建议先学一下

P5308 [COCI2019] Quiz

wqs二分+斜率优化DP

P4383 [八省联考2018]林克卡特树