AcWing 131. 直方图中最大的矩形
原题链接
简单
作者:
chaser_0
,
2024-04-15 22:48:22
,
所有人可见
,
阅读 5
千万注意q[0]的值(看注释上的标错的点)
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int a[N] , l[N] , r[N] , n , q[N];
int main()
{
while(cin >> n , n)
{
for(int i=1 ; i<=n ; i++) scanf("%d" , &a[i]);
int tt = 0; //q[i]存下标,q[0] = 0 对应的是a[0]=-1,所以说不用考虑边界问题(因为一定不会小于零)
a[0] = -1; a[n+1] = -1;
q[0] = 0;
for(int i=1 ; i<=n ; i++)
{
while(a[q[tt]] >= a[i]) tt --;
l[i] = q[tt];
q[++tt] = i;
}
// for(int i=0 ; i<=n ; i++) cout << q[i] << ' ';
// cout << endl;
tt = 0;
q[0] = n+1; //第一组数据中将q[0]变成了n+1,会影响后面的数据,所以在每组数据的开头应将q[0]初始化成0
for(int i=n ; i>=1 ; i--)
{
while(a[q[tt]] >= a[i]) tt --;
r[i] = q[tt];
q[++tt] = i;
}
// for(int i=0 ; i<=n ; i++) cout << q[i] << ' ';
// cout << endl;
// for(int i=1 ; i<=n ; i++) cout << l[i] << ' ';
LL res = 0;
for(int i=1 ; i<=n ; i++)
{
res = max(res , a[i]*(r[i] - l[i] - 1ll));
}
cout << res <<endl;
}
return 0;
}