csyの宝藏之地
首页项目归档照片墙音乐灵境说说杂谈友链关于
封面

单调栈:右侧第一个更大元素

写作时间:2026-07-31
# ACM
# 单调栈

算法理解

从右向左扫描,栈内存储可能成为答案的下标,并让对应值从栈顶到栈底递增。当前数会淘汰所有不比它大的候选;剩余栈顶就是右侧第一个更大元素。

  • 复杂度:O(n),每个下标只进栈、出栈一次。
  • 注意:如果要求“更大或相等”,弹栈条件要从 <= 改为 <。

模板代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
	stack<int>zhan;
	int n;
	cin>>n;
	vector<int>a(n+1);
	vector<int>ans;
	for (int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
//	输出之后第一个比i大的元素
	for (int i=n;i>0;i--)
	{
		while (zhan.size()&&a[zhan.top()]<=a[i])
		{
			zhan.pop();
		}
		if (!zhan.size()) zhan.push(i), ans.push_back(0);
		else
		{
			ans.push_back(zhan.top());
			zhan.push(i);
		}
	}
	for (int i=n-1;i>=0;i--)
	{
		cout<<ans[i]<<' ';
	}
	return 0;
}
avatar

csy

在代码、算法,模拟间穿梭的普通人。

RECOMMENDED

01 Trie:最大异或对

2026-07-31

邻接表

2026-07-31

高精度:加法

2026-07-31

Table of Contents

蜀ICP备2026044007号