斜率优化 笔记
推式子比代码长。
1. P3195 [HNOI2008] 玩具装箱
第一步:写出暴力
设
第二步:分流 & 拆式子
令
即当
将只和
令
第三步:讨论后面的转移点比前面的更优的条件
若
令
左边这个式子就相当于平面内经过
第四步:单调队列维护
令
可以证明转移点间的斜率一定是单调递增的:
考虑反证法。当
, 时,假设 是最优转移点。则 优于 , 也优于 ,即 ,与条件矛盾,故假设不成立。
运用单调队列的思想,维护队列中相邻两个点的斜率单调递增,且保证队头和队头后一个点的斜率
所有情况的单调队列取法总结:
, 单调增:维护队头斜率大于 ,斜率单调增,转移取队头。 , 单调减:维护队尾斜率小于 ,斜率单调增,转移取队尾。 , 单调增:维护队尾斜率大于 ,斜率单调减,转移取队尾。 , 单调减:维护队头斜率小于 ,斜率单调减,转移取队头。
先删尾,再加入,再删头,再转移。
2.
简要题意:有一个长度为
令
若
其他情况 1:与斜率比较的对象没有单调性
其实很好处理,根据大于号和小于号,单调队列维护递增还是递减的四条规律仍然适用,但是不能再保证队头或队尾和比较对象的关系,所以变成单调栈,然后二分找就行了。
3. P4655 [CEOI2017] Building Bridges
光速推柿子(因为没啥用),令
然后发现由于
其他情况 2:斜率也没有单调性
把式子推回去到这:
令
不过要注意边界问题,第
4. P4027 [NOI2007] 货币兑换
贪心,如果在第
设
把右边那一部分看成一次函数,李超线段树维护即可。
其他情况 2.1: 坐标是小数
离散化即可,小心 unique 后炸精度。