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