单调栈の笔记

单调栈

当作记笔记了,遗忘对于我来说来的太快,不规律的生活占了很大一部分,然而更讽刺的是,我在熬夜之余写下这篇笔记。

做了两道例题,分别为洛谷上的单调栈模板Bad Hair Day S

题目大意基本都是对于一个数列,要求维护一个数前/后第一个大于/小于他的数。为此,可以通过维护一个单调栈,保证栈内元素的单调性。

关于维护一个单调栈

  1. 弹出所有栈顶比他小的元素
  2. 栈顶此时为数列里第一个大于他的元素,即为答案
  3. 加入这个元素
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

posted @ 2025-06-20 04:12  tree_one  阅读(2)  评论(0)    收藏  举报