首页 > 其他分享 >P5788 【模板】单调栈

P5788 【模板】单调栈

时间:2023-02-27 13:12:42浏览次数:39  
标签:... 元素 样例 P5788 单调 模板

P5788 【模板】单调栈

【模板】单调栈

题目背景

模板题,无背景。

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

题目描述

给出项数为 n 的整数数列 a_{1 ... n}。

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

试求出 f(1... n)。

输入格式

第一行一个正整数 n。

第二行 n 个正整数 a_{1 ... n}。

输出格式

一行 n 个整数 f(1... n) 的值。

样例 #1

样例输入 #1

5
1 4 2 3 5

样例输出 #1

2 5 4 5 0

提示

【数据规模与约定】

对于 30% 的数据,n≤ 100;

对于 60% 的数据,n≤ 5 × 10^3 ;

对于 100% 的数据,1 ≤ n≤ 3× 10^6,1≤ a_i≤ 10^9。

分析

单调栈,就是一个栈,不过栈内元素保证单调性。即,栈内元素要么从小到大,要么从大到小。
而单调栈维护的就是一个数前/后第一个大于/小于他的数。

例题:P5788 【模板】单调栈
例题就是一个求每个数后第一个大于他的数。

那么重点来了:怎么做!面对这样的数据,不好下手。那么我们把她转化一下:有n个人,每个人向右看,求她看到的第一个人。
看图:

通过观察,我们会发现,在她后面的,比她矮的,一定会被她遮住。那么,这个点就没用了。而根据现实生活和刚才的推断,我们看到的人肯定是一个比一个高的,而没看到的,留着也没用,直接扔了QwQ。那么,这就是符合单调性的。再看,那些没用的人什么时候扔掉?当然是遇到比她高的人了。那么就可以一个一个地走掉,而且肯定是在已经判断过的人的前面(中间和后面的在之前就走掉了),所以就直接从前面弹出。咦?这不就像一个栈吗?没错,这就是单调栈的实现方法。

再归纳一下:

  • 从后往前扫

  • 对于每个点:

    • 弹出栈顶比她小的元素
    • 此时栈顶就是答案
    • 加入这个元素
      由于是从前往后输出,还要把答案放到一个数组里。

提交答案

#include<cstdio>
#include<stack>
using namespace std;
int n,a[3000005],f[3000005];//a是需要判断的数组(即输入的数组),f是存储答案的数组
stack<int>s;//模拟用的栈
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=n;i>=1;i--)
	{
		while(!s.empty()&&a[s.top()]<=a[i]) s.pop();//弹出栈顶比当前数小的
		f[i]=s.empty()?0:s.top();//存储答案,由于没有比她大的要输出0,所以加了个三目运算
		s.push(i);//压入当前元素
	}
	for(int i=1;i<=n;i++) printf("%d ",f[i]);//输出
	return 0;
}

标签:...,元素,样例,P5788,单调,模板
From: https://www.cnblogs.com/bujidao1128/p/17159303.html

相关文章

  • C++模板
    写在前面现在我们来开启C++不同于C语言的地方.大家都知道C语言没有标准的数据结构相关的库,而C++存在STL,原因就是C++支持泛型编程,这是我们今天需要知道重点,先来简单的认......
  • 模板设计模式
    1、什么是模板设计模式把抽象类(AbstractClass)整体看作是一个模板,模板中不能决定的东西定义成抽象方法(AbstractMethod),让继承的子类去重写抽象方法实现需求。2、使用......
  • 随记一下之模板语法
    模板语法介绍:双层大括号{{}}是默认的模板界定符,用于在HTML模板文件中界定模板语法。模板语法都包含在{{和}}中间。{{.}}语句{{.}}中的点表示当前对象......
  • WPF知识点备忘录——控件模板
    模板<Application.Resources><ResourceDictionary><!--将画刷等从模板拆分出来,方便重用--><RadialGradientBrushRadiusX="1"R......
  • c++函数模板
    函数模板是通用的函数描述,也就是说,它们使用泛型来定义函数,其中的泛型可用具体的类型(如int或double)替换。例如如果定义一个2个数交换值的函数,如果2个数是int,那就需要定义一......
  • 2023.2.26【模板】扩展Lucas定理
    2023.2.26【模板】扩展Lucas定理题目概述求\(\binom{n}{m}mod\)\(p\)的值,不保证\(p\)为质数算法流程(扩展和普通算法毫无关系)由于\(p\)不是质数,我们考虑[SDOI201......
  • 龟速乘&快速乘&快速幂&压位高精快速幂 模板
    龟速乘#defineintlonglonginlineintmul_slow(intx,inty,intmod){ intres=0; while(y){ if(y&1)res=(res+x)%mod; x=(x+x)%mod; y>>=1; } returnres......
  • acwing 单调栈
    原题给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。输入格式第一行包含整数N,表示数列长度。第二行包含N个整数,表示整数数列。......
  • wxss模板样式
               ......
  • 刷刷刷 Day 37 | 738. 单调递增的数字
    738.单调递增的数字LeetCode题目要求当且仅当每个相邻位数上的数字 x 和 y 满足 x<=y 时,我们称这个整数是单调递增的。给定一个整数n,返回小于或等于n的最......