考虑这样一个问题:给定数组 ({c_n},{d_n}),求数组 ({f_n}) 满足 (f_i=min_{j<i}{f_j+c_i imes d_j})。(c_i,d_i) 可能为负数。
按 (i) 从小到大计算 (f_i),并将所有 (j<i) 的 ((d_j,f_j)) 放在二维平面上。计算 (f_i),其实就是将平面上每个点的 (y) 加上 (c_i imes x),然后取全局最小的 (y)。
对于平面上的三个点 ((x_1,y_1),(x_2,y_2),(x_3,y_3))((x_1<x_2<x_3)),若 (operatorname{slope}((x_1,y_1),(x_2,y_2))>operatorname{slope}((x_2,y_2),(x_3,y_3))),那么 ((x_2,y_2)) 永远不是最优解。证明显然。
我们知道,一个下凸壳加上一条直线,仍然是一个下凸壳。于是,我们只需要维护一个支持插入点的下凸壳,计算 (f_i) 时在下凸壳内二分转折点即可。
一些题目只需要用单调队列维护,是因为其 (d) 数组具有单调性;有的甚至可以做到线性,是因为其 (c,d) 都具有单调性。