有一个正整数的数组,化为直方图,求此直方图包含的最大矩形面积。例如 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<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<queue>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
long long a[101010];
int main()
{
int n;
scanf("%d",&n);
a[n]=-1;
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
stack<int>b;
int l=0;
long long ans=0;
b.push(0);
for(int i=1;i<=n;i++)
{
if(a[i]>a[b.top()])
{
b.push(i);
}
else if (a[i]<a[b.top()])
{
while(!b.empty()&&a[i]<a[b.top()])
{
long long sum=(i-b.top())*a[b.top()];
if (sum>ans)
{
ans=sum;
}
l=b.top();
b.pop();
}
b.push(l);
a[l]=a[i];
}
}
printf("%lld\n",ans);
return 0;
}