代码如下 求求了QAQ
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int mina[maxn][maxn],maxa[maxn][maxn];
int temp[maxn][maxn];
int d[maxn][maxn];
void g_mi(int a,int b,int k) {
for(int j=1; j<=a; j++) {
int x=1;
deque<int> Q;
for(int i=1; i<=k; i++) {
while(!Q.empty()&&Q.back()>d[j][i]) {
Q.pop_back();
}
Q.push_back(d[j][i]);
}
temp[j][x++]=Q.front();
for(int i=k+1; i<=a; i++) {
int t=i-k;
if(!Q.empty()&&t>0) {
if(Q.front()==d[j][t]) {
Q.pop_front();
}
}
while(!Q.empty()&&d[j][i]<Q.back()) {
Q.pop_back();
}
Q.push_back(d[j][i]);
temp[j][x++]=Q.front();
}
while(!Q.empty()) {
Q.pop_back();
}
}
int l=b-k+1;
// for(int i=1;i<=a;i++){
// for(int j=1;j<=l;j++){
// cout<<temp[i][j]<<" ";
// }
// cout<<"\n";
// }
for(int i=1; i<=l; i++) {
int x=1;
deque<int> Q;
for(int j=1; j<=k; j++) {
while(!Q.empty()&&Q.back()>temp[j][i]) {
Q.pop_back();
}
Q.push_back(temp[j][i]);
}
mina[x++][i]=Q.front();
for(int j=k+1; j<=a; j++) {
int t=j-k;
while(!Q.empty()&&temp[j][i]<Q.back()) {
Q.pop_back();
}
if(!Q.empty()&&Q.front()==temp[t][i]) {
Q.pop_front();
}
Q.push_back(temp[j][i]);
mina[x++][i]=Q.front();
// cout<<mina[x-1][i]<<' ';
}
while(!Q.empty()) {
Q.pop_back();
}
// cout<<"\n";
}
return;
}
void g_ma(int a,int b,int k) {
memset(temp,0,sizeof(temp));
for(int j=1; j<=a; j++) {
int x=1;
deque<int> Q;
for(int i=1; i<=k; i++) {
while(!Q.empty()&&Q.back()<d[j][i]) {
Q.pop_back();
}
Q.push_back(d[j][i]);
}
temp[j][x++]=Q.front();
for(int i=k+1; i<=a; i++) {
int t=i-k;
if(!Q.empty()&&t>0) {
if(Q.front()==d[j][t]) {
Q.pop_front();
}
}
while(!Q.empty()&&d[j][i]>Q.back()) {
Q.pop_back();
}
Q.push_back(d[j][i]);
temp[j][x++]=Q.front();
}
while(!Q.empty()) {
Q.pop_back();
}
}
int l=b-k+1;
// for(int i=1;i<=a;i++){
// for(int j=1;j<=l;j++){
// cout<<temp[i][j]<<" ";
// }
// cout<<"\n";
// }
for(int i=1; i<=l; i++) {
int x=1;
deque<int> Q;
for(int j=1; j<=k; j++) {
while(!Q.empty()&&Q.back()<temp[j][i]) {
Q.pop_back();
}
Q.push_back(temp[j][i]);
}
maxa[x++][i]=Q.front();
for(int j=k+1; j<=a; j++) {
int t=j-k;
while(!Q.empty()&&temp[j][i]>Q.back()) {
Q.pop_back();
}
if(!Q.empty()&&Q.front()==temp[t][i]) {
Q.pop_front();
}
Q.push_back(temp[j][i]);
maxa[x++][i]=Q.front();
// cout<<maxa[x-1][i]<<' ';
}
while(!Q.empty()) {
Q.pop_back();
}
// cout<<"\n";
}
return;
}
int main() {
// freopen("test.txt","r",stdin);
int a,b,n;
cin>>a>>b>>n;
for(int i=1; i<=a; i++) {
for(int j=1; j<=b; j++) {
cin>>d[i][j];
}
}
g_mi(a,b,n);
// for(int i=1; i<=a-n+1; i++) {
// for(int j=1; j<=b-n+1; j++) {
// cout<<mina[i][j]<<' ';
// }
// cout<<"\n";
// }
g_ma(a,b,n);
int minc=1000000000;
for(int i=1; i<=a-n+1; i++) {
for(int j=1; j<=b-n+1; j++) {
minc=min(minc,maxa[i][j]-mina[i][j]);
// cout<<maxa[i][j]<<' ';
}
// cout<<"\n";
}
// cout<<"\n";
// for(int i=1; i<=a-n+1; i++) {
// for(int j=1; j<=b-n+1; j++) {
//// cout<<maxa[i][j]-mina[i][j]<<' ';
// }
//// cout<<"\n";
// }
cout<<minc;
return 0;
}