AcWing 131. 直方图中最大的矩形
宋标 Lv5

题目

直方图是由在公共基线处对齐的一系列矩形组成的多边形。

矩形具有相等的宽度,但可以具有不同的高度。

例如,图例左侧显示了由高度为 的矩形组成的直方图,矩形的宽度都为

![2559_1.jpg][]

通常,直方图用于表示离散分布,例如,文本中字符的频率。

现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。

图例右图显示了所描绘直方图的最大对齐矩形。

输入格式

输入包含几个测试用例。

每个测试用例占据一行,用以描述一个直方图,并以整数 开始,表示组成直方图的矩形数目。

然后跟随 个整数

这些数字以从左到右的顺序表示直方图的各个矩形的高度。

每个矩形的宽度为

同行数字用空格隔开。

当输入用例为 时,结束输入,且该用例不用考虑。

输出格式

对于每一个测试用例,输出一个整数,代表指定直方图中最大矩形的区域面积。

每个数据占一行。

请注意,此矩形必须在公共基线处对齐。

数据范围

,

输入样例:

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

输出样例:

8
4000

[2559_1.jpg]:

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <cstring>

using namespace std;

const int N = 1e5 + 10;

long long l[N], r[N], q[N], a[N];
int n;

int main()
{
while (scanf("%d", &n), n)
{
for (int i = 1; i <= n; ++ i) scanf("%lld", &a[i]);

a[0] = a[n + 1] = -1;

int tt = 0;
q[0] = 0;
for (int i = 1; i <= n; ++ i)
{
while (a[q[tt]] >= a[i]) -- tt;
l[i] = q[tt];
q[++ tt] = i;
}

tt = 0;
q[0] = n + 1;
for (int i = n; i; -- i)
{
while (a[q[tt]] >= a[i]) -- tt;
r[i] = q[tt];
q[++ tt] = i;
}

long long ans = 0;
for (int i = 1; i <= n; ++ i)
ans = max(ans, (r[i] - l[i] - 1) * a[i]);

printf("%lld\n", ans);
}

return 0;
}
 评论