码迷,mamicode.com
首页 > 其他好文 > 详细

【模板】 单调栈

时间:2020-07-11 16:56:36      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:class   mat   include   http   单调栈   printf   its   math   范围   

题意

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

数据范围

\(1\leq N\leq 10^{5}\)
\(1\leq 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\n",stk[cnt]);
        else puts("-1");
        stk[++cnt]=x;
    }
}

【模板】 单调栈

标签:class   mat   include   http   单调栈   printf   its   math   范围   

原文地址:https://www.cnblogs.com/hhyx/p/13284132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!