1、何为单调栈:顾名思义,栈中的元素是按照某种方式排列,但是必须是单调的,如果某元素破坏了栈的单调性,就弹出栈的元素,直到该元素满足栈的单调性为止。
2、用途:可以很方便的求出某元素左边或右边第一个比其大或者小的元素,且时间复杂度O(n);
训练赛的时候没能够做出来,自己当时根本就不知到什么是单调栈,更别说应用了,平时应该多多的积累一些知识点,遇到不会的赶紧去学习,感觉知识单单钻一个方向不行。
#include<cstdio>
#include<iostream>
#include<stack>
#define maxn 1000005
using namespace std;
int a[maxn];
int ans[maxn];
int main( )
{
int n;
int i, j;
while(scanf("%d", &n) != EOF )
{
for( i = 1; i <= n; i++ )
{
scanf("%d", a+i);
}
stack<int>s;
for( i = n; i >= 1; i-- )
{
while( !s.empty() && s.top() <= a[i] ) s.pop();
if( !s.empty()) ans[i] = s.top();
else ans[i] = 0;
s.push( a[i] );
}
for( i = 1; i <= n; i++ )
printf("%d\n", ans[i]);
}
return 0;
}