这道题可以说是单调栈求矩形最大面积的板子题了啊
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 }