【模板】 单调栈

题意

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

数据范围

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

题解

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

Code

#include
using namespace std;
#define rep(i,a,n) for(int i=a;i=x) cnt--;
        if(cnt) printf("%d\n",stk[cnt]);
        else puts("-1");
        stk[++cnt]=x;
    }
}

你可能感兴趣的:(【模板】 单调栈)