斜优小记
一个启发是,对于一个 \(i\) 的两个转移 \(j,k\),比较 \(j\) 与 \(k\) 的转移优劣。
可以用斜率优化的场景:对比后可以分拆出 \(slope(j,k)\le\texttt{只和i相关的一些东西}\) 的形式。
例如 P3195,首先写出转移方程
\(dp_i=\min\limits_{0\le j<i}\{dp_j+(s_i-s_j+i-j-1-L)^2\}\)
比较两个 \(j,k\),选 \(j\) 不选 \(k\) 当且仅当
记 \(T=s_i+i-L-1\),于是
化简得
令 \(X(i)=i+s_i, Y(i)=dp_i+(i+s_i)^2\),条件等价于
注意到 \(X(i)\) 单调,单调队列维护单调 slope 值,存储所有 \(<2T\) 的位置,每次队头即为最优转移点。
本质就是题解所说的,维护下凸壳,我比较懒不画图了。
另一个题是 P5785,用相同方法可以化简到
\(X(i)=i+sumf_i, Y(i)=dp_i-sumf_i\cdot s\)
注意到 \(Y(i)\) 并非单调,所幸斜率依然递增。所以需要维护整个下凸壳,然后二分找到 \(k_0<k<k_1\),也就是第一个小于 \(k\) 的位置。
其他都没啥了。记个思想就行,其他操作都是模板。
upd 2025/01/12
如果斜率也没有单调性怎么办呢?P4655
一个更通用的做法是李超树直接维护,略去不提。
我们考虑强行让斜率单调。我们采用 cdq 分治!不断分治,显然右侧点对左侧点无贡献,我们先递归左侧,计算出左侧点对右侧点的贡献后,递归右侧。根据 cdq 的理论,这样进行的转移是不重不漏的。
而我们计算完整个区间后,只需要归并排序所有点,就能强行让斜率单调,于是 cdq 内部得以正常斜优。
upd 2025/04/25
全给我去写李超树。太好写了!而且不需要考虑单调性,全部可以拍李超树。虽然可能会多一只 log qwq