古典叙事 · 技术札记

序章

山河有卷
人间有声

写代码,也写长风、旧城与未熄的灯。
愿每一篇随笔,都有自己的山水与回声。
阅览随笔

单调栈

单调栈

定义

单调栈即满足单调性的栈结构,只在一端进出。
就是在往栈里面插入元素的时候,从栈顶拿出一定的元素,以保证栈内的单调性。这样就可以快速找到类似于区间内的最小值之内的操作

伪代码

for (i64 i = n; i >= 1; i--)
	{
		while (!s.empty() && a[s.top()] <= a[i])
			{
				s.pop();//保证单调性
			}
		s.push(i);//插入新元素下标
	}

模板题

P5788 【模板】单调栈

题目背景

模板题,无背景。

2019.12.12 更新数据,放宽时限,现在不再卡常了。

题目描述

给出项数为 \(n\) 的整数数列 \(a_{1 \dots n}\)

定义函数 \(f(i)\) 代表数列中第 \(i\) 个元素之后第一个大于 \(a_i\) 的元素的下标,即 \(f(i)=\min_{i<j\leq n, a_j > a_i} \{j\}\)。若不存在,则 \(f(i)=0\)

试求出 \(f(1\dots n)\)

输入格式

第一行一个正整数 \(n\)

第二行 \(n\) 个正整数 \(a_{1\dots n}\)

输出格式

一行 \(n\) 个整数表示 \(f(1), f(2), \dots, f(n)\) 的值。

输入输出样例 #1

输入 #1

5
1 4 2 3 5

输出 #1

2 5 4 5 0

说明/提示

【数据规模与约定】

对于 \(30\%\) 的数据,\(n\leq 100\)

对于 \(60\%\) 的数据,\(n\leq 5 \times 10^3\)

对于 \(100\%\) 的数据,\(1 \le n\leq 3\times 10^6\)\(1\leq a_i\leq 10^9\)

AC代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
i64 n, m, k, sum = 0;
const i64 mod = 10007;
long a[3000006];
map<i64, i64> mp;
stack<i64> s;
i64 num[3000006];
int main()
{
	
	//找到右边第一个大于他的相当于找到大于他的那一个左边第一个小于他的
	cin >> n;
	for (i64 i = 1; i <= n; i++)
	{
		cin >> a[i];
		
	}
	for (i64 i = n; i >= 1; i--)
	{
		while (!s.empty() && a[s.top()] <= a[i])
		{
			s.pop();
		}
		if (!s.empty())
		{
			num[i] = s.top();
		}
		s.push(i);
	}
	for (i64 i = 1; i <= n; i++)
	{
		cout << num[i] << " ";
	}
}
posted @ 2025-08-11 15:24  Morphis‘  阅读(15)  评论(0)    收藏  举报

特别策划 · CINEMATIC NOTES

风沙与孤骑

风起塞外,
胜负在刀剑之前。

“把复杂拆成秩序,把未知写成答案。”
Morphis · 山河一卷 愿你从这里出发,仍能听见山风。 影像:farfarSébastien Goldberg / Unsplash