P2216 HAOI2007 理想的正方形

2022-03-14 08:02:30 字數 1224 閱讀 4338

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

輸入格式

第一行為三個整數,分別表示 \(a,b,n\) 的值;

第二行至第 \(a+1\) 行每行為 \(b\) 個非負整數,表示矩陣中相應位置上的數。

輸出格式

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

資料範圍

\(2≤a,b≤1000\)

\(n≤a,n≤b,n≤100\)

矩陣中的所有數都不超過 \(10^9\)。

輸入樣例:

5 4 2

1 2 5 6

0 17 16 0

16 17 2 1

2 10 2 1

1 2 2 2

輸出樣例:
1
題解

其實難點就是一維向二維變化的過程,如果是一維,我們可以用線段樹,單調佇列進行維護,

二維呢,其實就是多了\(n\)行,那麼我們可以還是沿用一維的思路

先對\(n\)行分別進行處理,就相當於,把前k個數的最小值,全都摔到\(k\)這一列去,然後,再對算出來的每行 的

資料,進行合併處理,每\(n\)行合併處理一次。這樣,就可以得出乙個\(n*n\)的矩陣內的最大值和最小值了

\(row_[i][j]\)表示第\(i\)行,從\(j-k+1\)列到\(j\)列這個區間的最小值

\(row_[i][j]\)表示第\(i\)行,從\(j-k+1\)列到\(j\)列這個區間的最大值

**

#includeusing namespace std;

const int n=1010;

int w[n][n],row_min[n][n],row_max[n][n];

int q[n];

int n,m,k;

void solve(int a,int len,int ans,int typede)

}int main()

int temp[n];

int col_min[n];

int col_max[n];

int ans=0x3f3f3f3f;

for(int j=k; j<=m; j++) }

cout

}

P2216 HAOI2007 理想的正方形()

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

P2216 HAOI2007 理想的正方形

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

P2216 HAOI2007 理想的正方形

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