Problem Description
有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积。例如 2,1,5,6,2,3,对应的直方图如下:
面积最大的矩形为5,6组成的宽度为2的矩形,面积为10。
输入
第1行:1个数N,表示数组的长度(0 <= N <= 50000) 第2 - N + 1行:数组元素A[i]。(1 <= A[i] <= 10^9)输出
输出最大的矩形面积输入样例
6 2 1 5 6 2 3输出样例
10
思路:
给定一序列,寻找某一子序列,使得子序列中的最小值乘以子序列的长度最大。单调栈的应用
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100000+100;
stack<int> S;
ll h[N];
int R[N],L[N];
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
for(int i=0 ;i<n;i++)
scanf("%lld",&h[i]);
while(S.size())
S.pop();
for(int i=0;i<n;i++)
{
while(S.size()&&h[S.top()]>=h[i])
{
S.pop();
}
if(S.empty())
L[i]=0;
else
L[i]=S.top()+1;
S.push(i);
}
while(S.size())
S.pop();
for(int i=n-1 ;i>=0 ;i--)
{
while(S.size()&&h[S.top()]>= h[i])
{
S.pop();
}
if(S.empty())
R[i]=n;
else
R[i]=S.top();
S.push(i);
}
ll ans=0;
for(int i=0;i<n;i++)
{
ans=max(ans,h[i]*(R[i]-L[i]));
}
printf("%lld\n",ans);
}
return 0;
}