“笛卡尔树把数组的两种秩序同时固定下来:中序位置保留原下标,堆序祖先记录区间里的较小值。于是一个区间的最小元素恰好是包住两端下标的最深祖先;单调栈则在从左到右扫描时只维护尚未确定右边界的祖先链。”
形式陈述 ​
扫描序列时维护索引栈,使对应值单调。加入新元素前,反复弹出不再可能成为后续答案的栈顶;每个元素至多入栈一次、出栈一次,因此总时间
直觉
单调栈只保留仍可能被未来元素首次击败、成为未来答案的候选,并让其键值按某方向单调。新元素到来时,所有被它支配且以后不可能更优的栈顶会一次性永久弹出;每个元素最多入栈、出栈各一次,所以看似嵌套的循环总成本线性。关键是明确相等元素的处理,否则“最近严格大于”和“最近大于等于”会混淆。
例子与边界
可在线性时间求每个位置左/右侧最近更小元素、柱状图最大矩形。相等元素若处理不一致,会导致重复边界或错误区间。
序列
单调栈只适合答案由邻近支配关系决定的问题,不能替代一般范围最大查询。重复值时使用 < 还是 <= 会影响边界归属;哨兵可统一清空栈,但其值和下标必须不污染真实答案。
推论与应用
它是摊还分析的简洁范例,并连接 Cartesian tree、区间贡献计数和凸包式候选淘汰。
栈 提供后进先出候选集,全序 定义支配,摊还分析 证明
单调栈扫描数组时维护“栈内下标递增、对应值单调,且尚未找到右侧更小项”的候选不变量。相同弹栈轨迹可在线性时间构造Cartesian Tree:最后弹出链成为新节点左子。该树再把RMQ转成 LCA。单调栈本身回答一次静态邻近关系,不支持数组更新;Cartesian tree 与 RMQ 也需固定并列规则。
参考资料
- OI-Wiki contributors, OI-Wiki (2026), monotonic stack.
- Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms, 4th ed. (2022), stack-based amortized patterns.