题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1506
题目大意:
有一行矩形,告诉你每个矩形的高度,求最大矩形的面积
例如,2,1,4,5,1,3,3,最大的面积是8
思路:
求出每一个矩形到 左边不小于 它的矩形的 最大距离 和到它 右边不小于 它的 最大距离,可以通过 单调栈 实现。
代码:
#include<cstdio>
#include<stack>
#include<iostream> //不支持万能头
using namespace std;
#define LL long long
const int N = 1e5 + 10;
struct node{
LL h, w;
};
LL n, sum, ans, h[N];
int main(){
while (1){
scanf("%d", &n);
if (n == 0) break;
ans = 0;
stack <node> s;
for (int i = 1; i <= n; i++)
scanf("%lld", &h[i]);
h[n + 1] = 0; //多输入一个 0,将栈内所有元素弹出
for (int i = 1; i <= n + 1; i++){
sum = 0;
while (!s.empty() && s.top().h > h[i]){
sum += s.top().w; //记录到左边的最大距离
ans = max(ans, sum * s.top().h);
s.pop();
}
s.push(node{h[i], sum + 1});
}
cout << ans << "\n";
}
return 0;
}