单调栈の笔记
单调栈
当作记笔记了,遗忘对于我来说来的太快,不规律的生活占了很大一部分,然而更讽刺的是,我在熬夜之余写下这篇笔记。
做了两道例题,分别为洛谷上的单调栈模板和Bad Hair Day S。
题目大意基本都是对于一个数列,要求维护一个数前/后第一个大于/小于他的数。为此,可以通过维护一个单调栈,保证栈内元素的单调性。
关于维护一个单调栈
- 弹出所有栈顶比他小的元素
- 栈顶此时为数列里第一个大于他的元素,即为答案
- 加入这个元素
void solve()//单调栈模板题
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
s.push({a[1], 1});
for (int i = 2; i <= n; i++)
{
while (!s.empty() && a[i] > s.top().first)
{
ans[s.top().second] = i;
s.pop();
}
s.push({a[i], i});
}
for (int i = 1; i <= n; i++)
cout << ans[i] << " ";
}
2025/6/20 4:08 UTC+8

浙公网安备 33010602011771号