POJ 2559 | | HDU 1506 Largest Rectangle in a Histogram 数据结构 单调栈问题

今天数据结构课上老师 表扬了别的同学的PPT,无意之间看到了单调栈的新名词。

Poj 2559        HDU 1506 这两题一模一样,是很经典的单调栈问题。

单调栈是指一个栈中的元素始终保持某种顺序(非递增、非递减)。

大佬的单调栈详细解释

#include <cstdio>
#include <stack>
#include <algorithm>
using namespace std;
int l[100005]={0};//i想左边遍历,第一个比它小的数的位置 
int r[100005]={0};//i向右边遍历,第一个比它小的数的位置 
int h[100005]={0};//记录直方图高度 
int main()
{
	int n;
	long long maxs;
	while(~scanf ("%d",&n)&&n)
	{
		stack <int> s;
		for (int i=1;i<=n;i++)
		{
			scanf ("%d",&h[i]);
		}
		for (int i=1;i<=n;i++)
		{
			while (!s.empty()&&h[s.top()]>=h[i])//要使用while循环弹出比当前元素不小的元素位置 
			{
				s.pop();	
			}
			if (!s.empty())
				l[i]=s.top();
			else
				l[i]=0;
			s.push(i);
		}
		stack <int> p; 
		for (int i=n;i>=1;i--)
		{
			while(!p.empty()&&h[p.top()]>=h[i])
			{
				p.pop();	
			}
			if (!p.empty())
				r[i]=p.top();
			else
				r[i]=n+1;
			p.push(i);
		}
		maxs=0;
		for (int i=0;i<=n;i++)
		{
			//要使用long long 储存 
			maxs=max(maxs,(long long)(r[i]-l[i]-1)*h[i]);
		}
		printf("%lld\n",maxs);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34022601/article/details/83064665