跳转至

单调栈

约 140 个字 12 行代码 预计阅读时间 1 分钟

O(n) 解决NGE问题(Next Greater Element),即序列中每个元素的下一个比它大的元素

维护一个栈stack,表示待确定NGE的元素

遍历序列,当新元素比栈顶大,说明新元素就是栈顶的NGE,弹出栈顶继续比较,直到新元素不比栈顶大,新元素入栈。

根据上面操作过程,显然栈内元素单调递减

组的题里有专门考单调栈的,但是区域赛真题大多是用单调栈优化DP的

int a[N],nge[N];
stack<int> sta;
a[n]=INF;
for(int i=0;i<=n;++i)
{
    while(!sta.empty() && a[i]>a[sta.top()])
    {
        nge[sta.top()]=i;
        sta.pop();
    }
    sta.push(i);
}