Largest Rectangle in a Histogram
题目大意
给定一堆积木,第 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;
}
}