最大矩形(單調佇列)

2021-10-04 15:19:14 字數 1187 閱讀 2225

給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2, 1, 4, 5, 1, 3, 3, 他們的寬都是1,其中最大的矩形是陰影部分。

輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 <= n <= 100000. 然後接下來n個整數h1, …, hn, 滿足 0 <= hi <= 1000000000. 這些數字表示直方圖中從左到右每個小矩形的高度,每個小矩形的寬度為1。 測試資料以0結尾。

對於每組測試資料輸出一行乙個整數表示答案。

7 2 1 4 5 1 3 3

4 1000 1000 1000 100008

4000

這個題目如果只是簡單暴力的話時間複雜度太高,不能ac,需要借助一種神奇的資料結構——單調佇列=單調+佇列=佇列中的元素滿足出隊順序的單調性,實現o(n)的時間複雜度解決問題,利用佇列分別找到每乙個位置向左/向右的數都大於等於他的最遠位置。(向左最遠位置-向右最遠位置+1)*高得到矩形的面積,我們需要列舉每個位置進行上述操作,找到最大矩形。

**如下:

#include

long

long h[

100005];

int st[

100005

],l[

100005

],r[

100005];

void

solve

(int n)

l[i]

=st[r]+1

; st[

++r]

=i;}

for(

int i=l;i<=r;i++

) r[st[i]

]=n;

for(

int i=

1;i<=n;i++)if

((r[i]

-l[i]+1

)*h[i]

>max)

max=

(r[i]

-l[i]+1

)*h[i]

;printf

("%lld\n"

,max);}

intmain()

return0;

}

單調棧 最大矩形 單調佇列 滑動視窗

給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 0 hi 1...

用單調佇列求解最大子矩形

考慮這樣乙個問題 n times m 的平面上有k個點 座標都是整數 求乙個面積最大的邊平行於座標軸的矩形,使得其內部不包含任何乙個給出的點 但是可以在邊界上 就比如說下面這幅圖 紅色的點是給出的點,那麼黑色框框表示的這個矩形就是要求的最大子矩形啦。最暴力的做法 提前預處理出乙個二維部分和,然後列舉...

最大矩形 單調棧

在這裡先簡單描述一下單調棧 單調棧 一種線性資料結構,棧內元素自棧頂到棧底滿足單調性。有單調遞增棧和單調遞減棧。如果要加入棧的元素不滿足單調性,則要將棧頂元素彈出,直到滿足條件為止,然後將該元素入棧 作用 給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4...