HAOI2007 理想的正方形

2021-08-15 22:02:00 字數 1270 閱讀 7769

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

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

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

僅乙個整數,為ab矩陣中所有"nn正方形區域中的最大整數和最小整數的差值"的最小值.

5 4 2

1 2 5 6

0 17 16 0

16 17 2 1

2 10 2 1

1 2 2 2

維護單調佇列,maxx[i][j]表示第i行以j為結尾的長度為min(j,len)的序列最大值;minn[i][j]表示第i行以j為結尾的長度為min(j,len)的序列最小值.

可以相當於使之縮成乙個點,因此有ansx[i][j]表示以(i,j)為右下方端點,邊長為min(j,len)的正方形的最大值;ansn[i][j]表示以(i,j)為右下方端點,邊長為min(j,len)的正方形的最小值.

最後n²列舉右下方端點更新答案即可.

**如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define r register

#define ll long long

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

struct node;

int n,m,len,a[1001][1001],maxx[1001][1001],minn[1001][1001];

int ansx[1001][1001],ansn[1001][1001],anss=1e9,l,r;

node q[10001];

node nod(int idd,int da);}

int main()

}fo(i,1,n)

}fo(j,1,m)

}fo(j,1,m)

}fo(i,len,n)

fo(j,len,m)

anss=min(anss,ansx[i][j]-ansn[i][j]);

cout0;}

HAOI 2007 理想的正方形

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

HAOI2007 理想的正方形

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

HAOI2007 理想的正方形

x與x所儲存的分別是1 n的長方形內的最大值,最小值。x i j 儲存第i行第jj n 1列的長方形中的最大值。同理,x i j 儲存第i行第jj n 1列的長方形中的最小值。這時再對這兩個陣列的每一列上的值進行維護,將x中每個區間的的最大值用y維護,將x中的每個區間的最小值用y維護。那麼y i j...