- C23panweiming's blog
单调栈
- 2024-4-3 16:57:48 @
来自 https://zhuanlan.zhihu.com/p/346536592
单调栈是一种和单调队列类似的数据结构。单调队列主要用于解决滑动窗口问题,单调栈则主要用于解决NGE问题(Next Greater Element),也就是,对序列中每个元素,找到下一个比它大的元素。(当然,“下一个”可以换成“上一个”,“比它大”也可以换成“比他小”,原理不变。)
这比单调队列还简单一点。我们维护一个栈,表示“待确定NGE的元素”,然后遍历序列。当我们碰上一个新元素,我们知道,越靠近栈顶的元素离新元素位置越近。所以不断比较新元素与栈顶,如果新元素比栈顶大,则可断定新元素就是栈顶的NGE,于是弹出栈顶并继续比较。直到新元素不比栈顶大,再将新元素压入栈。显然,这样形成的栈是单调递减的。
代码如下(输入输出格式见洛谷模板题):
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<int> V(n + 1), ans(n + 1);
for (int i = 1; i <= n; ++i)
cin >> V[i];
stack<int> S;
for (int i = 1; i <= n; ++i)
{
while (!S.empty() && V[S.top()] < V[i])
{
ans[S.top()] = i;
S.pop();
}
S.push(i);
}
for (int i = 1; i <= n; ++i)
cout << ans[i] << " ";
return 0;
}