一本通1604理想的正方形

2022-05-08 01:57:10 字數 3581 閱讀 3398

時間限制: 1000 ms         記憶體限制: 524288 kb

原題來自:haoi 2007

有乙個 a×b

'>a

×b 的整數組成的矩陣,現請你從中找出乙個 n×n

'>

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

第一行為三個整數,分別表示 a,b

,n'>

a,b,n 的值;

第二行至第 a+1

'>

a+1 行每行為 b

'>

b 個非負整數,表示矩陣中相應位置上的數。

輸出僅乙個整數,為 a×b

'>a

×b 矩陣中所有「n×n

'>

n×n 正方形區域中的最大整數和最小整數的差值」的最小值。

5 4 2

1 2 5 6

0 17 16 0

16 17 2 1

2 10 2 1

1 2 2 2

1
對於 20% 的資料 2≤a

,b≤100,n

≤10'>2≤a,b≤100,n≤10

;對於 100% 的資料 2≤a

,b≤1000,n

≤a,n

≤b,n

≤100

'>2≤a,b≤1000,n≤a,n≤b,n≤100

,矩陣中的所有數都不超過 10

9'>

109。2≤

a,b≤

1000,n

≤a,n

≤b,n

≤100

'>10

9'>sol:這題有兩種做法(二維st表,二維單調佇列)2≤

a,b≤

1000,n

≤a,n

≤b,n

≤100

'>10

9'>二維st表:顧名思義二維的st表,st[i][j][k]表示以(i,j)為左下角,邊長為 2k 的正方形的最值,很好處理

#include using

namespace

std;

typedef

intll;

inline ll read()

while

(isdigit(ch))

return (f)?(-s):(s);

}#define r(x) x=read()inline

void

write(ll x)

if(x<10

)

write(x/10

); putchar((x%10)+'0'

);

return;}

inline

void

writeln(ll x)

#define w(x) write(x),putchar(' ')

#define wl(x) writeln(x)

const

int n=1005,b=10,inf=0x3f3f3f3f

;int

n,m,k,st_max[n][n][b],st_min[n][n][b];

inline

int max4(int a,int b,int c,int

d)inline

int min4(int a,int b,int c,int

d)int

main()

for(i=1;i<=7;i++)}}

int ans=inf;

intoo;

for(oo=0;;oo++) if(((1

<1

<=k)) break

;

for(i=1;i+k-1

<=n&&ans;i++)

}wl(ans);

return0;

}/*input

5 4 2

1 2 5 6

0 17 16 0

16 17 2 1

2 10 2 1

1 2 2 2

output

1*/

二維st表

二維單調佇列:先處理出min[i][j][0]表示以(i,j)為右下角的長度為n的一整條中的最小值,用單調佇列a*b就可以處理出來了

再用min[i][j][0]到列上去跑單調佇列,得到min[i][j][1]表示以(i,j)為右下角的乙個n*n的正方形中的最小值

#include using

namespace

std;

typedef

intll;

inline ll read()

while

(isdigit(ch))

return (f)?(-s):(s);

}#define r(x) x=read()inline

void

write(ll x)

if(x<10

)

write(x/10

); putchar((x%10)+'0'

);

return;}

inline

void

writeln(ll x)

#define w(x) write(x),putchar(' ')

#define wl(x) writeln(x)

const

int n=1005,inf=0x3f3f3f3f

;int

n,m,l,val[n][n];

int min[n][n][2],max[n][n][2

];struct

record

ddq[n];

intmain()

for(i=1;i<=n;i++)

;while(head1) head++;

min[i][j][

0]=ddq[head].shuz;

}head=1; tail=0

;

for(j=1;j<=m;j++)

;while(head1) head++;

max[i][j][

0]=ddq[head].shuz;}}

for(j=l;j<=m;j++)

;while(head1) head++;

min[i][j][

1]=ddq[head].shuz;

}head=1; tail=0

;

for(i=1;i<=n;i++)

;while(head1) head++;

max[i][j][

1]=ddq[head].shuz;}}

int ans=inf;

for(i=l;i<=n;i++)

wl(ans);

return0;

}/*input

5 4 2

1 2 5 6

0 17 16 0

16 17 2 1

2 10 2 1

1 2 2 2

output

1*/

二維單調佇列

理想的正方形

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

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個非負整數,表示矩陣中相應位置上的數。每 行相鄰兩數之間用一空格分隔。...