DP 凸优化(WQS 二分 & Slope Trick) 笔记
一、WQS 二分
考虑有下面这个问题:
有
个物品,每个物品有价值 ,价值有正有负,你选择恰好其中 个物品求最大价值。
其实直接贪心就能做,但是考虑下面这种做法:
假如五个物品的价值分别是

称这种斜率(即一次函数
用一根直线去切这个凸包,切到一个交点就是一个答案。

但是

现在就切到
所以我们可以二分斜率,那怎么知道切到了哪个点呢呢?观察下面这两条斜率相同的直线:

会发现在凸包上只切到一个点的直线,截距(即一次函数的
最后找到答案时,由于减去了
1. P2619 [国家集训队] Tree I
对白边的边权做 WQS 二分。
2. P5633 最小度限制生成树
对给定点连的边的边权做 WQS 二分。
3. CF739E Gosha is hunting
对一种球直接 dp,另一种球做 WQS 二分。
二、Slope trick
参考资料:https://codeforces.com/blog/entry/77298。
从上面的 WQS 二分部分,我们一定已经清楚了凸包是什么。
1. 拐点维护凸包法
首先将斜率变化的点称作“分界点”,定义一种凸包表示法:将
凸包

再比如这个凸包:

第一个分界点横坐标为
使用这种表示法还有一个好处,只需要知道任意一段的函数表达式,就可以求得每一段的函数表达式,并且方便的得到每一段的斜率。
1.5 阅读下文须知
如果下文中提到一个点的斜率 / 截距,指这个点所在直线的斜率 / 截距。
对于拐点,则指拐点右侧的直线。因为“拐点所在直线”是一个未定义行为。
2. 凸包基本操作
(1). 两凸包相加
如果
因此拐点集合合并:

(2). 找函数最值
就是找凸包斜率为
(3). 平移
假设
所以,干脆直接让坐标轴平移,如上例,让坐标轴向左平移
因此,也就不能再加上
这个减掉多少显然是可以一直往下传递的,所以要专门整个变量维护坐标轴的移动情况。需要注意的是,有时候大根堆和小根堆可能分别对应两个不同的坐标轴(下文将会提到),所以必要时需要两个变量。
(如图,改变

所以,整个变量维护坐标轴平移即可。
因此平移后还是凸包。
(4). 维护前缀
例如对一个下凸包
那就把小根堆里的东西全丢掉就好了,因为从小根堆开始
因此维护后还是凸包。
(5). 维护前面某个区间取
例如对一个下凸包
你会发现由于下凸包,所以当
如下图是
因此维护后还是凸包。

3. CF713C Sonya and Problem Wihtout a Legend
(1). 暴力求解
首先将
暴力的 dp 想法:设
(2). 证明凸包
显然地,
如果第
然后
所以从
然后
(3). 实现凸包
每当加入函数
也就是说,往
(4). 实现求答案
接着考虑怎么算答案,其实就是要算最后
为方便记述,定义
若
也就是说,我们一直维护一个变量
若
我滴任务,完成啦!!!哈哈哈哈……
4. AT_abc217_h [ABC217H] Snuketoon
什么神经分讨啊。
(1). 暴力求解
设
: 。 : 。
(2). 证明凸包
看完上面那题一眼能看出这是凸包吧……
(3). 实现凸包
其实就是第二章中操作
以下是我一开始还没有系统归纳那些操作时的想法:
因为
对于
重点讲解
它的
(4). 实现求答案
答案就是
假设
如果
所以
否则,由于
假设这个堆顶是
所以像上一题一样整个
(5). 对于
是同理的,照着重新分析一遍即可。