POJ 2559 - Largest Rectangle in a Histogram - [单调栈]
题目链接:http://poj.org/problem?id=2559
题意:
给出 $n(1 \le n \le 10^5)$ 个宽为 $1$,高为 $h_i(0 \le h_i \le 10^9)$ 的矩形,它们从原点开始并排在 $x$ 轴上,
现在要求出,这个合并产生的图形内部最大的矩形的面积。
Sample Input
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
Sample Output
8
4000
题解:
如果矩形的高度从左到右是单增的,那么答案必然是尝试每个矩形的高度作为答案矩形的高度,而宽度则一直延伸到右边界。
如果出现了某个矩形,其高度比上一个矩形小,那么可想而知,此前那些矩形往右延伸遇到了当前这个矩形,高度必然要被压低,
换句说,再往后,答案矩形的高度就受制于当前矩形而非前面那些矩形了。因此,可以将前面所有高过我的矩形统统变成跟我一样高的。
这样一来,栈内维护的矩形高度永远是单增的。
AC代码:
#include<iostream> #include<cstdio> #include<stack> #include<algorithm> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn=100000+10; int n,h[maxn]; stack<pii> S; int main() { while(scanf("%d",&n) && n) { for(int i=1;i<=n;i++) scanf("%d",&h[i]); ll ans=0; for(int i=1;i<=n;i++) { if(S.empty() || h[i]>=S.top().first) { S.push(make_pair(h[i],1)); } else { int w=0; while(S.size() && h[i]<S.top().first) { w+=S.top().second; ans=max(ans,(ll)w*S.top().first); S.pop(); } S.push(make_pair(h[i],w+1)); } } int w=0; while(!S.empty()) { w+=S.top().second; ans=max(ans,(ll)w*S.top().first); S.pop(); } printf("%I64d\n",ans); } }
转载请注明出处:https://dilthey.cnblogs.com/