这道题可以说是单调栈求矩形最大面积的板子题了啊
Code:

1 #include <cstdio>
2 #define ll long long
3 using namespace std;
4 const int N = 1e5 + 7;
5 int n, height, top;
6 ll ans, tot, tmp;
7 struct node{
8 int h, num;
9 //h存当前矩形高度
10 //num存当前矩形左侧比自己高的矩形个数, 也就是以当前的矩形高为高的矩形的宽度
11 }stk[N];
12 int main () {
13 while (~scanf("%d", &n) && n) {
14 top = ans = 0;
15 for (int i = 0; i < n; i++) {
16 scanf("%d", &height);
17 tmp = 0;
18 while (top > 0 && stk[top - 1].h >= height) {//比新加进的矩形高的矩形先出栈
19 tot = stk[top - 1].h * (stk[top - 1].num + tmp);//先计算一下之前的最大面积
20 if (tot > ans) ans = tot;//更新答案
21 tmp += stk[top - 1].num;
22 top--;
23 }
24 stk[top].h = height;
25 stk[top].num = 1 + tmp;//更新宽度
26 top++;
27 }
28 tmp = 0;
29 while (top > 0) {//到最后的时候再做一遍,相当于加进了一个高度为0的矩形
30 tot = stk[top - 1].h * (stk[top - 1].num + tmp);
31 if (tot > ans) ans = tot;
32 tmp += stk[top - 1].num;
33 top--;
34 }
35 printf("%lld\n", ans);
36 }
37 return 0;
38 }
