斜率优化是个好东西,,,然而$sd\ gql$一直想学却一直没$get$嘤嘤嘤
所以在拖了$inf$天之后总算还是来开个斜率优化的坑,,,
然后因为斜率优化只是个方法,所以可能就不像别的知识点分好几个方面,我估计我就只港下原理,然后放几道经典题$QwQ$?
$over$
好然后接下来就要进入正题了嗷$QwQ$
原理
从一个例题入手港趴.玩具装箱(我感觉这是斜率优化最经典一道例题,,,?好像我看到的每一篇斜率优化题解都是拿它引入的$hhh$
首先推出$O(n^{2})$的$dp$式嘛,就$f_{i}=(f_{j}+(i-j+sum[i]-sum[j]-1-l)^{2})_{min},j<i$,且$sum_{i}$单增
设$A=sum_{i}+i,B=sum_{j}+j+l+1$(只与$A$有关&只与$B$有关$QwQ$
为了方便先把$min$搞掉,于是原式可化为$f_{i}=f_{j}+(A-B)^{2}\\f_{i}=f_{j}+A^{2}+B^{2}-2\cdot A\cdot B\\f_{j}+B^{2}=2\cdot A\cdot B+f_{i}-A^{2}$
设$y=f_{j}+B^{2},k=2\cdot A,x=B,b=f_{i}-A^{2}$
于是这个就化成了一个,直线解析式,现在的目标就是使截距$min$咯$QwQ$
没有图自己意会着想下,,,?
大概想象下,在坐标轴上有若干个点,坐标为(B,f_{j}+B^{2}),每个点都被斜率相同($=A_{i}$)的直线穿过,然后现在求的是$b_{min}$
感性思考下不难发现构成下凸壳的$(B,f_{j}+B^{2})$才可能为最优解
瞎证下趴
若对于$j_{1},j_{2},j_{3}$,若$j_{2}$可能为最优解,则有$b_{1}\geq b_{2},b_{2}\leq b_{3}$,代入式子得$y_{1}-k\cdot x_{1}\geq y_{2}-k\cdot x_{2},y_{2}-k\cdot x_{2}\leq y_{3}-k\cdot x_{3}\\y_{2}-y_{1}\leq k\cdot (x_{2}-x_{1}),y_{3}-y_{2}\geq k\cdot (x_{3}-x_{2})$
变下形可得,若$j_{2}$可能为最优解,一定有$\frac{y_{2}-y_{1}}{x_{2}-x_{1}}\leq \frac{y_{3}-y_{2}}{x_{3}-x_{2}}$,也就说相邻两点的斜率一定要是递增的,也就是说要维护一个下凸壳
欧克然后这题就大概港完辣,,,呜呜呜我总算$get$斜率优化了,,,果然还是太愚蠢嘛我感觉我学了好久才懂嘤嘤嘤,,,
$upd:$凸包的好难理解啊,,,我改入半平面交了$kk$
注意点
主要是提醒自己的,,,$QwQ$
1)队列最初不能为空,且必须放0.不能放1是因为可能存在从0转移过来的结果,就会挂
2)$min$维护下凸包,$max$维护上凸包
3)不等号方向,,,$QAQ$
4)尽量让$x$单增,不然容易出现一些乱七八糟的错误$QAQ$
5)斜率优化其实有个前提条件,是说,$x$坐标必须是单调的,然后现在考虑,如果不单调怎么做呢?就要考虑用平衡树/$cdq$分治辽$QwQ$(目前还太菜了没碰到过这种题目,,,$so$只是泛泛而谈,,,等我做了这种题目应该会写题解到时候把题解地址放上来鸭$QwQ$
6)放个学长的总结昂$QwQ$
斜率单调暴力移指针
斜率不单调二分找答案
x坐标单调开单调队列
x坐标不单调开平衡树|cdq分治
7)没什么意义的一个$mk$,,,听说好像能用斜率优化的都能用李超线段树,,,?教练我想学嘤嘤嘤
例题
可以戳这儿$QwQ$
[ ]玩具装箱
[ ]防御准备
[ ]序列分割
[ ]土地购买
[ ]仓库建设
[ ]任务安排
[ ]特别行动队
[ ]BZOJ3437
[ ]BZOJ4518
[ ]货币兑换($cdq$分治/平衡树,,,显然我会咕辽$QAQ$