基准时间限制:1 秒 空间限制:131072 KB 分值: 20
难度:3级算法题
有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积。例如 2,1,5,6,2,3,对应的直方图如下:
![](http://img.51nod.com/upfile/000fbce2/08d164337bdb2808000000000027de17.png)
面积最大的矩形为5,6组成的宽度为2的矩形,面积为10。
Input
第1行:1个数N,表示数组的长度(0 <= N <= 50000) 第2 - N + 1行:数组元素A[i]。(1 <= A[i] <= 10^9)
Output
输出最大的矩形面积
Input示例
6 2 1 5 6 2 3
Output示例
10
对于每个小的矩形来说,它所能参与拼接的大矩形的面积可视为向左找高度不比它低的和向右找高度不比它低的矩形拼成的大矩形的面积。
#include <bits/stdc++.h>
#define maxn 50005
using namespace std;
long long a[maxn],Left[maxn],Right[maxn];
// left[i]表示第i个矩形左右最大可以延伸到矩形的位置
int main()
{
int n,i;
cin>>n;
for(i=1; i<=n; ++i)
{
cin>>a[i];
Left[i]=i;
Right[i]=i;
}
Left[0]=Left[n+1]=-1;
for(i=2; i<=n; ++i) //找到每个矩形的最大左延伸
{
while(a[Left[i]-1] >= a[i])
{
Left[i]=Left[Left[i]-1];
}
}
Right[0]=Right[n+1]=-1;
for(i=1; i<=n-1; ++i) //找到每个矩形的最大右延伸
{
while(a[Right[i]+1] >= a[i])
{
Right[i]=Right[Right[i]+1];
}
}
long long sum=0;
for(i=1; i<=n; ++i)
{
if((Right[i]-Left[i]+1)*a[i]>sum)
sum= (Right[i]-Left[i]+1)*a[i];
}
cout<<sum<<endl;
return 0;
}