#include <bits/stdc++.h>
using namespace std;
const int INF = 0;
const int maxn=1005 ;
const int logn=10;
int a,b,n;
int mmax[maxn][maxn][logn];//mmax[i][j][k]表示第ij点为起点,向右下2的k次的方形矩阵中最大的数
int mmin[maxn][maxn][logn];
int ans=INF;
int len;
int maa(int x,int y,int z,int t){
int e=max(x,y);
int g=max(z,t);
return max(e,g);
}
int mii(int x,int y,int z,int t){
int e=min(x,y);
int g=min(z,t);
return min(e,g);
}
void rmq(){
for(int k=1;k<=7;++k){
for(int i=1;i+(1<<k)-1<=a;++i){
for(int j=1;j+(1<<k)-1<=b;++j){
mmax[i][j][k]=maa(mmax[i][j][k-1],mmax[i+(1<<(k-1))][j][k-1],mmax[i][j+(1<<(k-1))][k-1],mmax[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
mmin[i][j][k]=mii(mmin[i][j][k-1],mmin[i+(1<<(k-1))][j][k-1],mmin[i][j+(1<<(k-1))][k-1],mmin[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
}
}
}
}
int query(int i, int j) {
int ma, mi;
ma = maa(mmax[i][j][len], mmax[i + n - (1 << len)][j][len - 1], mmax[i][j + n - (1 << len)][len - 1], mmax[i + n - (1 << len)][j + n - (1 << len)][len - 1]);
mi = mii(mmin[i][j][len], mmin[i + n - (1 << len)][j][len - 1], mmin[i][j + n - (1 << len)][len - 1], mmin[i + n - (1 << len)][j + n - (1 << len)][len - 1]);
return ma - mi;
}
int main()
{
scanf("%d%d%d",&a,&b,&n);
len=log2(n);
for(int i=1;i<=a;++i){
for(int j=1;j<=b;++j){
scanf("%d",&mmax[i][j][0]);
mmin[i][j][0]=mmax[i][j][0];
}
}
rmq();
for(int i=1;i<=a-n+1;++i){
for(int j=1;j<=b-n+1;++j){
ans=min(ans,query(i,j));
}
}
printf("%d\n",ans);
return 0;
}
只有10pts,评论区有佬发了一组数据
8 7 4
61 52 58 52 10 92 47
64 73 7 12 60 62 25
73 37 37 37 26 56 83
4 43 48 90 15 3 98
6 99 37 6 85 8 70
81 40 96 47 1 94 18
51 1 41 47 68 58 50
55 67 37 90 83 40 9
答案83 也跑出来了,实在没找到哪有问题,求调