二維單調佇列

2021-07-27 21:34:39 字數 1480 閱讀 1576

發個昨天考試的題 二維單調佇列

單調佇列之前也學了但沒做過題,沒寫過。但我感覺也不難,今天直接搞了個二維的;

然後發個單調佇列最初的講解以便看懂下面的話。點這

t1 為了和諧

(square.pas/c/cpp)

[問題背景]

在機房裡,有兩隻小可愛,乙隻大可愛,乙隻小可愛。其中大可

愛對大的東西感興趣,小可愛對小的東西感興趣。

現在有乙個 a*b 的矩陣,矩陣中每個位置都有乙個非負整數 i

( 0<=i<=2000 000 000),兩隻小可愛要在這個矩陣中選擇乙個 n*n 的

正方形,大可愛要正方形中的最大數,小可愛要正方形中的最小數。

但是,如果兩個人的數字差距過大的話,就會造成矛盾……為了

機房人民的和諧相處,請你幫他們選擇這個正方形,使得這個差距最

小。 [問題描述]

有乙個 a*b 的整數組成的矩陣,現請你從中找出乙個 n*n 的正

方形區域,使得該區域所有數中的最大值和最小值的差最小。

input (square.in)

第一行 3 個整數 a b n

接下來 a 行,每行 b 個非負整數。

output (square.out)

僅乙個整數,表示正方形中最大數與最小數之差[樣例輸入]

5 4 2

1 2 5 6

0 17 16 0

16 17 2 1

2 10 2 1

1 2 2 2

[樣例輸出]

1 hint

1, 矩陣中所有數小於 2000 000 000

2, 20%資料, 2<=a,b<=100, n<=a, n<=b, n<=10

3, 100%資料, 2<=a,b<=1000, n<=a, n<=b, n<=100

先每行搞單調佇列,乙個最大乙個最小。然後對應在原先的位置存起來對應區間的最值,然後按列搞,把每個位置上區間的最值再比乙個最值,然後就是矩形的最值了。

**

hljs perl">#include

#include

#define n 1010

using namespace std;

struct mmaxn[n],minn[n];

int mar[n][n],ma[n][n],mi[n][n],n,a,b,ha,hi,ta,ti,ans;

int main()

}for(int j=1;j<=b-(n-1);++j)

} ans=0x7fffffff;

for(int i=1;i<=a-(n-1);++i)

for(int j=1;j<=b-(n-1);++j)

ans=min(ans,ma[i][j]-mi[i][j]);

printf("%d",ans);

return

0;

}

scu 3636 二維單調佇列

題意 從乙個大a b的矩陣中,找出乙個n n正方形的區域,找出最大值和最小值,最後輸出a b矩陣中所有 n n正方形區域中的最大整數和最小整數的差值 的最小值。做法 二維單調佇列,類似那個滑窗的題目。對於這題可以考慮將每一行的長度為n的區段的最大值和最小值都壓縮到乙個點上,這邊就可以單調佇列的做法,...

理想的正方形(單調佇列在二維的應用)

理想的正方形 題解 用單調佇列分別維護行與列。這裡只講求 n n 區間內的最大值的維護方法,最小值同樣的方法維護即可。具體實現方法 說明 原陣列 mat,列陣列 q 遍歷每一行,當行達到了n,就說明列向已經滿足了n,這個時候就開始在行內維護n長度的最大值了 也就是說我的 並沒有完全等到y max構造...

二維陣列與二維指標

1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...