传送门:理想正方形
思路:
代码:
#include<iostream>
#include<cstring>
#include <cmath>
#include<algorithm>
#include <vector>
#include <stack>
using namespace std;
typedef long long LL;
const int N=1e3+10;
int w[N][N];
int q[N];
int n,m,k;
int rmax[N][N],rmin[N][N];
void get_min(int a[],int b[],int cnt)
{
int hh=0,tt=-1;
for(int i=1;i<=cnt;i++)
{
if(hh<=tt&&q[hh]<=i-k) hh++;
while(hh<=tt&&a[q[tt]]>=a[i]) tt--;
q[++tt]=i;
b[i]=a[q[hh]];
}
}
void get_max(int a[],int b[],int cnt)
{
int hh=0,tt=-1;
for(int i=1;i<=cnt;i++)
{
if(hh<=tt&&q[hh]<=i-k) hh++;
while(hh<=tt&&a[q[tt]]<=a[i]) tt--;
q[++tt]=i;
b[i]=a[q[hh]];
}
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&w[i][j]);
for(int i=1;i<=n;i++)
{
get_max(w[i],rmax[i],m);
get_min(w[i],rmin[i],m);
}
int res=1e9;
int a[N],b[N],c[N];
for(int i=k;i<=m;i++)
{
for(int j=1;j<=n;j++) a[j]=rmin[j][i];
get_min(a,b,n);
for(int j=1;j<=n;j++) a[j]=rmax[j][i];
get_max(a,c,n);
for(int j=k;j<=n;j++) res=min(res,c[j]-b[j]);
}
cout<<res<<endl;
return 0;
}