题目链接:

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;
}
posted on 2021-11-20 16:34  Hamine  阅读(23)  评论(0编辑  收藏  举报