POJ 2559 題解 最大矩形面積 單調棧

2021-08-08 06:20:21 字數 1442 閱讀 2152

地面上從左到右併排緊挨著擺放多個矩形,已知這此矩形的底邊寬度都為1,高度不完全相等。求在這些矩形包括的範圍內能得到的面積最大的矩形,列印出該面積。所求矩形可以橫跨多個矩形,但不能超出原有矩形所確定的範圍。

如 n = 7, 序列為2 1 4 5 1 3 3

口                     口           

口口 回回

口口 口口 回回 口口

口 口口 口口 口 回回 口口

口口口口口口口 口口回回口口口

最大面積:8

輸入有多組資料,每組資料一行:

第乙個數n,表示矩形個數

後面跟n個正整數,第i個正整數hi表示第i個矩形的高度。

最後一行,以乙個單獨的0結束。

每組輸入資料一行,乙個數表示最大矩形面積。

7 2 1 4 5 1 3 3

4 1000 1000 1000 1000

0

8

4000

30 %: 1<=n<=100

60 %: 1<=n<=1,000

100%: 1<=n<=500,000,0<=hi<=1,000,000,000

解題思路:

這題資料範圍是1<=n<=500,000,0<=hi<=1,000,000,000,又是多組資料,所以我們幾乎只能考慮o(n)演算法。題目要求找最大矩形的面積,那麼就等價於對於每個統計圖高度,找到他左邊第乙個比他小的位置和右邊第乙個比他小的位置即可。那麼跑一邊單調棧即可解決問題。

ac**:

#include

#include

#include

#define ll long

long

using

namespace std;

int n,a[

500005

],l[

500005

],r[

500005

];int st[

500005

],tp;

llmx(ll

x,ll

y)void

work

()for

(int i=

1;i<=n;i++)

l[i]=st[tp]+1;

tp++;

st[tp]=i;

}for

(int i=

1;i<=n;i++)

printf

("%lld\n"

,maxn);

}int

main

()return0;

}

poj 2559 最大矩形面積(單調棧)

題目 輸入乙個整數n,代表有n個 1 寬度 h i 高度 的矩形。接下來n個數依次給定乙個矩形高度的高度h i i n 求 在給定的依次排列的這堆矩形構成的圖形裡用乙個矩形圈出最大的乙個矩形,求該最大矩形面積。include include include using namespace std t...

POJ2559 單調佇列

題目大意 給定n個連續的寬度為1的矩形,求最大子矩形面積。求一遍每個點向右延伸的最長長度,再反著求一遍每個點向左延伸的最長長度,兩個加起來 要減去重複計算的本身長度 取最優解。這題為什麼會wa呢?因為可能會有長度為0的矩形,這時候必須往佇列裡push個 1才能把它彈出來。而如果不把它彈出來,它的延伸...

POJ2559 單調遞增棧

題意大概講述的是有許多寬度為1的矩形,問你最大面積的矩形是多少。更具模型可以得知,要是有乙個高度較小塊進入後,無法給前面高度較高的塊增加同一高度的面積。這時候就可以處理前面的高塊,因為現在的塊是較低的,已經沒辦法可以接到後面較高的。所以刪去前面所有比當前塊高的塊,並且處理這些塊可以得到的面積。最後一...