模板 单调栈

Posted hhyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板 单调栈相关的知识,希望对你有一定的参考价值。

题意

传送门
给定一个长度为(N)的整数数列,输出每个数(A_{i})左边第一个比它小的数,如果不存在则输出(-1)

数据范围

(1leq Nleq 10^{5})
(1leq A_{i} leq 10^{9})

题解

栈中存的数是单调上升的,因为后加入的数永远比前加入的数靠后,所以在新加入数的时候只会先考虑后加入的,
对于每一个数将栈中所有大于它的出栈后剩下的就是左边第一个小于它的
只有前面的数比后加入的小才会被考虑到,所以栈中只会存单调上升的序列

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
const int N=1e5+10;
int n;
int stk[N],cnt;
int main(){
    scanf("%d",&n);
    rep(i,0,n){
        int x;scanf("%d",&x);
        while(cnt && stk[cnt] >=x) cnt--;
        if(cnt) printf("%d
",stk[cnt]);
        else puts("-1");
        stk[++cnt]=x;
    }
}





以上是关于模板 单调栈的主要内容,如果未能解决你的问题,请参考以下文章

单调队列单调栈优先队列模板

单调栈算法 入门+博客推荐+模板

模板 - 数据结构 - 单调队列/单调栈

739. 每日温度 : 单调栈模板题

模板 单调栈

单调栈图文详解(附Java模板)