线性优化技巧学习笔记

· · 算法·理论

单调栈

现有一数列 a,请在 \Theta(n) 的复杂度,对每个 i 求出最小的 j > i 使得 a_j > a_i,记为 f_i.若不存在这样的 j,记 f_i = n + 1

这个问题称作 NGE 问题(Next Greater Element).用到单调栈的时候,99% 都是这个背景.应用如下:

观察不难发现,长度为 L 的线段数,一开始为 1 且增长速度为 1,当线段触碰到 lr 中的一个后增长速度变为 0,再碰到一个后变为 -1.这是两个斜线,考虑二阶差分,该操作即可变为四次单点修改.

回顾一下这个矩形问题,其实暗含的是这样一个想法:对于一个数组 a 的任意一个区间 [l, r],考虑取 [l, r] 中的最小值 a_i 作为代表.但有一个问题是最小值有多个,所以我们考虑取 最左侧 的最小值 a_i 作为代表.

这样以来,每个区间都有唯一的代表.而上面 NLE 和 LNGE 的配合,其实就是在找对于一个 a_i,以其为代表的所有区间.它恰好是设 l_i = \operatorname{LNGE}(i) + 1r_i = \operatorname{NLE}(i) - 1 后,[l_i, r_i] 内所有包含了 i 的子区间.由于区间代表的唯一性,这样统计出来的区间必定不重不漏.