時間限制: 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 21 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二維st表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*/
二維單調佇列:先處理出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個非負整數,表示矩陣中相應位置上的數。每 行相鄰兩數之間用一空格分隔。...