131直方图中的最大矩形 这道题目是单调栈,以及求最大矩形面积的一个经典题型
作者:
土拨
,
2024-08-05 22:10:19
,
所有人可见
,
阅读 4
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int h[N], q[N], l[N], r[N]; // l为每个数左侧离自己最近且比自己小的数,q为单调栈
int main()
{
int n;
while(cin >> n, n)
{
for(int i = 1; i <= n; i ++) scanf("%d", &h[i]);
h[0] = h[n + 1] = -1; //先把左右边界记为-1
int tt = 0;
q[tt] = 0; //把这个直方图最左边1的左边的0放入栈
for(int i = 1; i <= n; i ++)
{
while(tt && h[i] <= h[q[tt]]) tt --;
l[i] = q[tt];
q[++ tt] = i;
}
tt = 0;
q[tt] = n + 1;
for(int i = n; i; i --)
{
while(tt && h[i] <= h[q[tt]]) tt --;
r[i] = q[tt];
q[++ tt] = i;
}
LL res = 0;
for(int i = 1; i <= n; i ++)
{
res = max(res, (LL)h[i] * (r[i] - l[i] - 1));
}
cout << res << endl;
}
return 0;
}