vijos 1580最大矩形(單調棧)

2021-07-24 15:49:44 字數 1529 閱讀 8038

p1580最大矩形accepted

描述 在x軸上水平放置著n個條形圖,這n個條形圖就組成了乙個柱狀圖,每個條形圖都是乙個矩形,每個矩形都有相同的寬度,但是它們的高度並不相同。

比如,圖1包含的矩形的高分別為2,1,4,5,1,3,3單位長度,矩形的寬為1單位長度。

你的任務就是計算柱狀圖中以x軸為底邊的最大矩形的面積。圖2陰影部分就是上述例子的最大矩形面積。

格式 輸入格式

一組資料報含若干行,每行是乙個整數n(1≤n≤100,000),表示柱狀圖包含n個矩形。緊接著n個整數h1,…,hn(0≤ hi ≤20,000, 1≤ i≤ n),表示柱狀圖中按從左到右順序給出的矩形的高度。矩形的寬度為1。

輸出格式

輸出若干行,每行乙個整數s,表示以x軸為底邊的最大矩形的面積。

思路:每乙個點都作為最低點,左邊滿足的矩形個數和右邊滿足的矩形個數

program df;

var i,j,n,m,x,y,z,k,t:longint;

ans,s:int64;

a,b,c,d,e,f:array[0..100000] of longint;

function max(x,y:int64):int64;

begin

if x>y then exit(x)

else exit(y);

end;

begin

while not eof do

begin

ans:=0;

fillchar(a,sizeof(a),0);

fillchar(b,sizeof(b),0);

fillchar(d,sizeof(d),0);

fillchar(e,sizeof(e),0);

read(n);

for i:=1 to n do

read(a[i]);

t:=0; b[0]:=0;

for i:=1 to n do

begin

while (t>=0) and (a[b[t]]>=a[i]) do dec(t); //維護左邊的點的個數

d[i]:=b[t]+1;

inc(t);

b[t]:=i;

end;

t:=0; b[0]:=n+1;

for i:=n downto 1 do

begin

while (t>=0) and (a[b[t]]>=a[i]) do dec(t); //維護右邊點的個數

e[i]:=b[t]-1;

inc(t);

b[t]:=i;

end;

for i:=1 to n do

begin

s:=e[i]-d[i]+1;

s:=s*a[i];

ans:=max(ans,s); //比較每乙個點作為最低點,乘積的大小

end;

writeln(ans);

end;

end.

最大矩形 單調棧

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

最大矩形 單調棧

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

最大矩形(單調佇列)

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