RT,跑两遍单调队列求出最小值和最大值矩阵,再遍历求答案。然后wa了,错误信息都是read 0 expect 9
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#define N 2010
#define int long long
#define re register
using namespace std;
int n,m,k,head,tail;
int minn[N][N],maxx[N][N],Lmin[N][N],Lmax[N][N],q[N],a[N],p[N];
inline void read(int &x)
{
char c;x=0;int f=1;
while(!isdigit(c))
{
if(c=='-')f=-1;
c=getchar();
}
while(isdigit(c))x=x*10+c-'0',c=getchar();
x*=f;
}
void get_min(int x){
head=1,tail=0;int cnt=0;
for(int i=1;i<=k;++i){
while(head<=tail&&q[tail]>=a[i])tail--;
q[++tail]=a[i];
p[tail]=i;
}
Lmin[x][++cnt]=q[head];
for(int i=k+1;i<=m;++i){
while(head<=tail&&q[tail]>=a[i])tail--;
q[++tail]=a[i];
p[tail]=i;
while(p[head]<i-k+1)head++;
Lmin[x][++cnt]=q[head];
}
}
void get_max(int x){
head=1,tail=0;int cnt=0;
for(int i=1;i<=k;++i){
while(head<=tail&&q[tail]<=a[i])tail--;
q[++tail]=a[i];
p[tail]=i;
}
Lmax[x][++cnt]=q[head];
for(int i=k+1;i<=m;++i){
while(head<=tail&&q[tail]<=a[i])tail--;
q[++tail]=a[i];
p[tail]=i;
while(p[head]<i-k+1)head++;
Lmax[x][++cnt]=q[head];
}
}
void get_minans(int x){
head=1,tail=0;int cnt=0;
for(int i=1;i<=k;++i){
while(head<=tail&&q[tail]>=Lmin[i][x])tail--;
q[++tail]=Lmin[i][x];
p[tail]=i;
}
minn[++cnt][x]=q[head];
for(int i=k+1;i<=n;++i){
while(head<=tail&&q[tail]>=Lmin[i][x])tail--;
q[++tail]=Lmin[i][x];
p[tail]=i;
while(p[head]<i-k+1)head++;
minn[++cnt][x]=q[head];
}
}
void get_maxans(int x){
head=1,tail=0;int cnt=0;
for(int i=1;i<=k;++i){
while(head<=tail&&q[tail]<=Lmax[i][x])tail--;
q[++tail]=Lmax[i][x];
p[tail]=i;
}
maxx[++cnt][x]=q[head];
for(int i=k+1;i<=n;++i){
while(head<=tail&&q[tail]<=Lmax[i][x])tail--;
q[++tail]=Lmax[i][x];
p[tail]=i;
while(p[head]<i-k+1)head++;
maxx[++cnt][x]=q[head];
}
}
signed main()
{
read(n),read(m),read(k);
for(int i=1;i<=n;++i)
{
for(re int j=1;j<=m;++j)
{
read(a[j]);
}
get_min(i);get_max(i);
}
for(int j=1;j<m;++j)
{
get_minans(j);get_maxans(j);
}
int ans=2147483647;
for(int i=1;i<n;++i)
{
for(int j=1;j<m;++j)
{
ans=min(ans,maxx[i][j]-minn[i][j]);
}
}
printf("%lld",ans);
return 0;
}