引入: 题目类型
对于这样的一类柿子
\[dp_i = \min_{j < i} (dp_j - a_i d_j) , a_{i + 1} \geq a_i, d_{j + 1} \geq d_j
\]
朴素的单调队列显然无法优化, 考虑通过 斜率优化 将其转化成只与 \(j\) 有关的形式方便优化
操作: 具体原理
首先是一个转化
拆掉 \(\min\)
\[dp_i = dp_j - a_i d_j
\]
得到
\[dp_j = dp_i + a_i d_j
\]
令 \(y = dp_j\) , \(k = a_i\) , \(x = d_j\) , \(b = dp_i\) , 柿子变成一次函数的形式
\[y = kx + b
\]
这里的转化需要满足如下性质
\(k\) 只与 \(i\) 有关, 单调递增
\(b\) 只与 \(i\) 有关, 且只有其包含 \(dp_i\)
\(x\) 只与 \(j\) 有关, 单调递增
\(y\) 只与 \(j\) 有关, 且只有其包含 \(dp_j\)
把 \(dp_i\) 看做未确定的变量, 问题转化为用一条斜率为 \(k\) 的直线去切一些决策点 \((x, y)\) , 求直线截距的最小值
容易发现维护下凸包之后, 找到斜率 \(< k , > k\) 的转折点即可
然后根据 \(k, x\) 的单调性, 你发现这个做法可以拓展到整个序列上, 复杂度 \(\mathcal{O} (n)\) , 结束