【POJ】Largest Rectangle in a Histogram

Largest Rectangle in a Histogram

Link


题目大意

给定一堆积木,第 i i i 个积木的高度为 a i a_i ai ,问在这些积木上取矩形的最大面积是多少?

解题思路

显然如果两个积木中间隔了一个高度小的积木,那么面积的高只能去小的那个,所以用单调栈自栈底向栈顶递增。
在进栈的时候,一个新积木弹出的积木肯定比他大,那么前面的积木的底长也可以累加进入新的积木。
每次在弹出的时候计算面积取最值。
最后要清一轮都没被弹出的积木。

code

#include<iostream>
#include<cstdio>
#define int long long
#define mp make_pair
#define fst first
#define scd second
using namespace std;

int n,top;
int a[100010];
pair<int,int> b[100010];

signed main()
{
	while(scanf("%lld",&n))
	{
		if(n==0) return 0;
		for(int i=1;i<=n;i++)
			scanf("%lld",&a[i]);
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			int len=1;
			while(a[i]<=a[b[top].fst]&&top)
				len+=b[top].scd,ans=max(ans,a[b[top--].fst]*(len-1));
			b[++top]=mp(i,len);
		}
		int len=0;
		while(top) len+=b[top].scd,ans=max(ans,len*a[b[top--].fst]); 
		cout<<ans<<endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值