```cpp
//理想的正方形
//快速处理出每个子矩阵的最大值和最小值
//O(1)复杂度取最大最小,O(n^2)复杂度枚举
#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int a, b, n;
int g[N][N];//矩阵
int r_max[N][N], r_min[N][N];//第一维处理行最值
int c_max[N][N], c_min[N][N];//第二遍在前面的基础上把每一列的行最值再处理出最值,从而直接得出子矩阵最值
int res = 0x3fffffff;
void get_max(int b[], int a[], int n,int m)
{
int q[N], hh = 0, tt = 0;
for (int i = 1; i <= n; i++)
{
//判断队头是否弹出
if (hh <= tt && i - q[hh] >= m) hh++;
//维护单调递减队列
while (hh <= tt && a[q[tt]] <= a[i]) tt--;
q[++tt] = i;
if (i >= m) b[i - m + 1] = a[q[hh]];
}
}
void get_min(int b[], int a[], int n, int m)
{
int q[N], hh = 0, tt = 0;
for (int i = 1; i <= n; i++)
{
//判断队头是否弹出
if (hh <= tt && i - q[hh] >= m) hh++;
//维护单调递增队列
while (hh <= tt && a[q[tt]] >= a[i]) tt--;
q[++tt] = i;
if (i >= m) b[i - m + 1] = a[q[hh]];
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> a >> b >> n;
for (int i = 1; i <= a; i++)
for (int j = 1; j <= b; j++) cin >> g[i][j];
//处理行最值
for (int i = 1; i <= a; i++)
{
get_max(r_max[i], g[i], b, n);
get_min(r_min[i], g[i], b, n);
}
//处理列最值
int A[N], B[N];//用来拷贝数据
for (int j = 1; j <= b; j++)
{
//先拷贝每一列的数据
for (int i = 1; i <= a; i++) A[i] = r_max[i][j];
for (int i = 1; i <= a; i++) B[i] = r_min[i][j];
//列的数据被c以行的形式存了进来,后面要转置一波
get_max(c_max[j], A, a, n);
get_min(c_min[j], B, a, n);
}
for (int i = 1; i <= a; i++)
{
for (int j = 1; j <= b; j++)
cout << c_max[j][i] << ' ';
cout << endl;
}
//开始枚举
for (int i = 1; i+n-1 <= a; i++)
for (int j = 1; j+n-1 <= b; j++)
res = min(res, c_max[j][i] - c_min[j][i]);
cout << res << endl;
return 0;
}
哪里出了问题呢,怎么WA了一个点