斜率优化总结
妈的这玩意儿实在是太神秘了。。。一会儿对x排序一会儿对y排序,一会儿建凸包一会儿李超树。。。
这些细节性的东西还是写一个总结为好。不然以后一直犯要吃大亏。
众所周知斜率优化的方程都能够写成类似 \(dp[i]=\max_{j=1}^{n}(x[i]\times k[j]+b[j])\)。即一个一次函数的形式,并且这个一次函数是动态给出的。这个形式决定了斜率优化肯定能用李超树去做。
但是如果要求线性呢?线性一般使用单调队列,还是得去推柿子。
假设我们有两个决策点 \(i\) 和 \(j\),要求在 \(x\) 处的最值。
众所周知最值问题都可以通过寻找谁比谁逊来解决。
\[x\times k[i]+b[i]<x\times k[j]+b[j]
\]
\[x<\frac{b[j]-b[i]}{k[i]-k[j]}
\]
\[-x>\frac{b[j]-b[i]}{k[j]-k[i]}
\]
你也可以:
\[\frac{k[i]-k[j]}{b[j]-b[i]}<\frac{1}{x}
\]
\[\frac{k[i]-k[j]}{b[i]-b[j]}>-\frac{1}{x}
\]
对于第一种情况,需要找到一个点满足前面的斜率都比 \(-x\) 小,后面的都比 \(-x\) 大,所以需要斜率递增的下凸壳。同理,后者需要上凸壳。
但是需要注意几点。
如果要使用单调队列维护凸壳,需要保证给出的分母是递增的。(因为实际上是前缀的凸壳,每次都需要重新排序的);如果要线性寻找答案,需要保证对应的 \(-x\) 和 \(-\frac{1}{x}\) 是递增的。
这个其实做题的时候分析比较好。。。如果记结论容易写挂的说。。。
如果以上二者都不满足,最好使用李超线段树,常数不大+好写好调,不像某个CDQ套凸包要调半天。