对于每个数字入栈前,都要去检查栈顶的元素,如果栈顶的元素比当前数字大
则弹出栈顶元素。考虑前两个数a b,如果a > b,那么b的
左边第一个比他小的数字肯定就不是a,所以a对于b来说是没有用的,于是就把a删掉。
那么,删掉的这个a对于后面的数有没有影响呢?也就是说,我们删掉a以后,
后面有没有一个数,它的左边第一个比它小的数是a?答案是否定的。
因为既然a > b,那么对于后面的某个数,在找它的左边第一个比它小的数时,肯定先找到b
因为b比a更靠右。每次我们处理第i个数的时候,前面比他大的数都删掉了
剩下的肯定是小于它的,因此这个栈是单调增加的。栈顶就是它的左边第一个比它小的数
#include<iostream>
#include<stack>
using namespace std;
const int N = 1e5 + 11;
int a[N], l[N];
stack<int> st;
int main(){
int n;
scanf("%d", &n);
a[0] = -1;
for(int i = 1;i <= n; i++) scanf("%d", &a[i]);
st.push(0);
for(int i = 1;i <= n; i++){
while(st.size() && a[st.top()] >= a[i]) st.pop();
l[i] = st.top();
st.push(i);
}
for(int i = 1;i <= n; i++) cout << a[l[i]] << " ";
return 0;
}