發個昨天考試的題 二維單調佇列
單調佇列之前也學了但沒做過題,沒寫過。但我感覺也不難,今天直接搞了個二維的;
然後發個單調佇列最初的講解以便看懂下面的話。點這
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 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...