单调栈的一些应用

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;
} 

 

你可能感兴趣的:(单调栈,hm 与 zx 的故事系列)