hdu1506 Largest Rectangle in a Histogram——单调栈的基本运用

题目链接

AC代码

#include<iostream>

using namespace std; 
typedef long long ll;
const int N = 1e5+9;
ll h[N];
int n;
int stk[N],l[N],r[N];//左边第一个比它小的数,
//右边第一个 比它小的数字的下标 
int tt = 0;
int main(){
    
    
    
    while(~scanf("%d",&n)&&n)
    {
    
    
    	for(int i=1; i<=n; i++)	scanf("%lld",&h[i]);
		//求l数组
		tt = 0;
		for(int i=1; i<=n; i++)
		{
    
    
			//如果栈顶元素大于当前元素,那么就出栈 
			while(tt&&h[stk[tt]]>=h[i]) tt--;
			//如果此时栈非空,那么栈顶的元素就是左边第一个
			//比它小的数字 ,否则左边没有比它小的数字 
			if(tt) l[i] = stk[tt];
			else l[i] = 0;
			//当前元素的下标入栈 
			stk[++tt] = i;
		} 
		//求r数组 
		tt = 0;
		for(int i=n; i>=1; i--)
		{
    
    
			//如果栈顶元素大于当前元素,那么就出栈 
			while(tt&&h[stk[tt]]>=h[i]) tt--;
			//如果此时栈非空,那么栈顶的元素就是右边第一个
			//比它小的数字 ,否则右边边没有比它小的数字 
			if(tt) r[i] = stk[tt];
			else r[i] = n+1;
			//当前元素的下标入栈 
			stk[++tt] = i;
		}
		ll ans = -1;
		for(int i=1; i<=n; i++)
		{
    
    
			//对于i能延申的范围为r[i] -1 -(l[i]+1)+1  = r[i] - l[i]-1 
			ans = max(ans,(r[i]-l[i]-1)*h[i]);
		}
		printf("%lld\n",ans);
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45769627/article/details/112672987