AcWing 131. 直方图中最大的矩形
作者:
C丶
,
2024-03-24 15:29:20
,
所有人可见
,
阅读 2
#include <iostream>
using namespace std;
const int N = 100010;
typedef long long LL;
int l[N], r[N], stk[N], h[N], tt;
int main()
{
int n;
while(scanf("%d", &n), n)
{
for(int i = 1; i <= n; i ++) scanf("%d", &h[i]);
h[0] = -1, h[n + 1] = -1; // 让两个边界高度为-1 保证左右能找到更小的值
tt = 0;
for(int i = 0; i <= n; i ++)
{
while(tt && h[i] <= h[stk[tt]]) tt --;
if(tt) l[i] = stk[tt];
// else l[i] = -1; // 这一步不需要了 因为左右边界有-1必定有更小的值
stk[++tt] = i;
}
tt = 0;
for(int i = n + 1; i >= 1; i --)
{
while(tt && h[i] <= h[stk[tt]]) tt --;
if(tt) r[i] = stk[tt];
stk[++tt] = i;
}
LL res = 0;
for(int i = 1; i <= n ; i ++) res = max(res, (r[i] - l[i] - 1) * (LL)h[i]);
cout << res << endl;
}
}