单调栈的一些应用
1、何为单调栈:顾名思义,栈中的元素是按照某种方式排列,但是必须是单调的,如果某元素破坏了栈的单调性,就弹出栈的元素,直到该元素满足栈的单调性为止。
2、用途:可以很方便的求出某元素左边或右边第一个比其大或者小的元素,且时间复杂度O(n);
?
hm 与 zx系列故事题目链接
训练赛的时候没能够做出来,自己当时根本就不知到什么是单调栈,更别说应用了,平时应该多多的积累一些知识点,遇到不会的赶紧去学习,感觉知识单单钻一个方向不行。
?
#include<cstdio>#include<iostream>#include<stack>#define maxn 1000005using 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;}
?