由于码风问题,自己找不出来
#include<bits/stdc++.h>
using namespace std;
int a,b,n,g[1010][1010],ans=0x3f3f3f3f;
int hi1=1,ti1,qi1[1010][1010],gi[1010][1010];
int ha1=1,ta1,qa1[1010][1010],ga[1010][1010];
int hi2=1,ti2,qi2[1010][1010];
int ha2=1,ta2,qa2[1010][1010];
int main(){
scanf("%d%d%d",&a,&b,&n);
for(int i=1;i<=a;i++)
{
for(int j=1;j<=b;j++)
scanf("%d",&g[i][j]);
}
for(int i=1;i<=a;i++)
{
for(int j=1;j<=b;j++)
{
while(hi1<=ti1&&qi1[i][hi1]<=j-n)
hi1+=1;
while(hi1<=ti1&&g[i][qi1[i][ti1]]>=g[i][j])
ti1-=1;
ti1+=1;
qi1[i][ti1]=j;
gi[i][j]=qi1[i][hi1];
while(ha1<=ta1&&qa1[i][ha1]<=j-n)
ha1+=1;
while(ha1<=ta1&&g[i][qa1[i][ta1]]<=g[i][j])
ta1-=1;
ta1+=1;
qa1[i][ta1]=j;
ga[i][j]=qa1[i][ha1];
}
}
for(int j=1;j<=b;j++)
{
for(int i=1;i<=a;i++)
{
while(hi2<=ti2&&qi2[hi2][j]<=i-n)
hi2+=1;
while(hi2<=ti2&&gi[qi2[ti2][j]][j]>=gi[i][j])
ti2-=1;
ti2+=1;
qi2[ti2][j]=i;
while(ha2<=ta2&&qa2[ha2][j]<=i-n)
ha2+=1;
while(ha2<=ta2&&ga[qa2[ta2][j]][j]<=ga[i][j])
ta2-=1;
ta2+=1;
qa2[ta2][j]=i;
if(i>=n&&j>=n)ans=min(ans,ga[qa2[ha2][j]][j]-gi[qi2[hi2][j]][j]);
}
}
printf("%d",ans);
return 0;
}
样例输出 -1