P2216 HAOI2007 理想的正方形

2022-03-04 03:29:25 字數 1356 閱讀 1082

有乙個a*b的整數組成的矩陣,現請你從中找出乙個n*n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。

輸入格式:

第一行為3個整數,分別表示a,b,n的值

第二行至第a+1行每行為b個非負整數,表示矩陣中相應位置上的數。每行相鄰兩數之間用一空格分隔。

輸出格式:

僅乙個整數,為a*b矩陣中所有「n*n正方形區域中的最大整數和最小整數的差值」的最小值。

輸入樣例#1:

5 4 2

1 2 5 6

0 17 16 0

16 17 2 1

2 10 2 1

1 2 2 2

輸出樣例#1:

1

問題規模

(1)矩陣中的所有數都不超過1,000,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

solution:

本題單調佇列(當然也可以倍增)。

如果是一維的情況,就是經典的滑動視窗求極值的問題了。

考慮二維的情況,我們在每行都跑下單調佇列,處理出$(i,j)$往左$n$個位置的極值。

再在處理出的$(i,j)$的行極值上,以每列的情況跑下單調佇列,就能處理出$(i,j)$為右下角所在的$n*n$矩形內的極值了。

**:

/*

code by 520 -- 9.19

*/#include

#define il inline

#define ll long long

#define re register

#define for(i,a,b) for(re int (i)=(a);(i)<=(b);(i)++)

#define bor(i,a,b) for(re int (i)=(b);(i)>=(a);(i)--)

using

namespace

std;

const

int n=1005

;int a,b,n,l1,r1,l2,r2,mp[n][n],x[n][n][2],y[n][n][2],q[n][2],ans=0x7fffffff

;int

gi()

intmain()

}for(j,n,b)

}cout

0;

}

P2216 HAOI2007 理想的正方形()

題目鏈結 有乙個a乘b的整數組成的矩陣,現請你從中找出乙個nn的正方形區域,使得該區域所有數中的最大值和最小值的差最小。輸入輸出格式 輸入格式 第一行為3個整數,分別表示a,b,n的值 第二行至第a 1行每行為b個非負整數,表示矩陣中相應位置上的數。每行相鄰兩數之間用一空格分隔。輸出格式 僅乙個整數...

P2216 HAOI2007 理想的正方形

有乙個 a b 的整數組成的矩陣,現請你從中找出乙個 n n 的正方形區域,使得該區域所有數中的最大值和最小值的差最小。輸入格式 第一行為三個整數,分別表示 a,b,n 的值 第二行至第 a 1 行每行為 b 個非負整數,表示矩陣中相應位置上的數。輸出格式 輸出僅乙個整數,為 a b 矩陣中所有 n...

P2216 HAOI2007 理想的正方形

p2216 haoi2007 理想的正方形 那來練手的板子題。去年普及組考慮單調佇列,感覺很慌。然後打算再複習一波。就找到了這個題。題目中 a,b 不大,可以容忍 o ab 的複雜度。而且子矩陣的寬度也是有限制的,最大最小也是可以分別分開計算的。所以可以先統計 n ast 1 大小的矩陣,然後縮成乙...