「杂谈」关于斜率优化维护凸包
化柿子的时候化成一次函数的形式更直观一些(对我来说)。
如果是单调栈上二分 / 单调队列,这一类的,通常都是斜率或者某些东西具有单调性,这个东西不需要也尽量不要对每一种情况都整理下来应该怎么优化,是死板的。斜率优化是把一类 dp 问题变成数据结构问题,让数据结构维护这个凸包(或者说维护凸包上两点连线的斜率),应该具体情况具体分析。
如果加的决策点没有单调性,通常是 平衡树 / CDQ 分治 来解决,平衡树的话就是直接维护这个凸包,CDQ 分治则是通过分治来转成静态问题,然后用单调栈等数据结构解决。
有一种更普遍的做法,跳出维护凸包给我们思维上的限制,用李超树来维护一次函数(直线),也是一个 \(\log\) 的,而且码力要求和常数上肯定都优于平衡树,但常数还有可能比较大(相比 CDQ 分治来说?),但不需要动脑子(也就是前文说的具体情况具体分析,分析哪些变量是单调的,这个凸包的形状是怎样的,依次加进去的决策点坐标的单调性,截凸包的直线斜率的单调性...),论性价比李超树也是一个很好的选择。