51nod-【1102 面積最大的矩形】
阿新 • • 發佈:2019-02-17
收藏
關注
有一個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下:
面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。
Input
第1行:1個數N,表示陣列的長度(0 <= N <= 50000) 第2 - N + 1行:陣列元素A[i]。(1 <= A[i] <= 10^9)Output
輸出最大的矩形面積Input示例
6 2 1 5 6 2 3Output示例
10
和poj的2082是一類題目,其實我們對於每一個小的矩形,
它的最大面積就是這個小矩形能向左右延伸的最大長度,
那肯定是左邊第一個小於它的和右邊第一個小於它的
我們用到一個棧,(棧按照高度從小到大順序,假設每一個小矩形的
寬度為1);對於當先小矩形的高度小於棧頂小矩形的高度,那麼我們
就可以計算出在這其中的小矩形的面積的最大值,一直出棧,直到
棧頂小矩形的高度小於當前小矩形的高度為止
#include<cstdio> #include<stack> using namespace std; typedef long long LL; struct rec { LL w,h; }a; int main() { int n; scanf("%d",&n); LL ans=0,toph=0; stack<rec>sta; while(n--) { scanf("%lld",&a.h); a.w=1; if(a.h>=toph) sta.push(a); else { LL tempw=0,temps=0; while(!sta.empty()&&sta.top().h>a.h) { tempw+=sta.top().w; temps=sta.top().h*tempw; if(temps>ans) ans=temps; sta.pop(); } a.w+=tempw; sta.push(a); } toph=a.h; } LL total=0,temps=0; while(!sta.empty()) { total+=sta.top().w; temps=total*sta.top().h; if(temps>ans) ans=temps; sta.pop(); } printf("%lld\n",ans); return 0; }