rt,单调队列写炸了,只有20分,kack数据全过
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e3 + 10;
deque<int> dqx, dqm;
int a, b, n, ans, v[maxn][maxn], mn[maxn][maxn], mx[maxn][maxn], x[maxn][maxn];
int main() {
scanf("%d %d %d", &a, &b, &n);
for (int i = 1; i <= a; i++) {
while (dqx.size()) dqx.pop_back();
while (dqm.size()) dqm.pop_back();
for (int j = 1; j <= b; j++) {
scanf("%d", v[i] + j);
if (dqx.size() && dqx.front() + n <= j) dqx.pop_front();
if (dqm.size() && dqm.front() + n <= j) dqm.pop_front();
while (dqx.size() && v[i][j] > v[i][dqx.back()]) dqx.pop_back();
while (dqm.size() && v[i][j] < v[i][dqm.back()]) dqm.pop_back();
dqx.push_back(j);
dqm.push_back(j);
if (j >= n) {
mx[i][j] = v[i][dqx.front()];
mn[i][j] = v[i][dqm.front()];
}
}
}
ans = 0x3f3f3f3f;
for (int j = n; j <= b; j++) {
while (dqx.size()) dqx.pop_back();
while (dqm.size()) dqm.pop_back();
for (int i = 1; i <= a; i++) {
if (dqx.size() && dqx.front() + n <= i) dqx.pop_front();
if (dqm.size() && dqm.front() + n <= i) dqm.pop_front();
while (dqx.size() && v[i][j] > v[dqx.back()][j]) dqx.pop_back();
while (dqm.size() && v[i][j] < v[dqm.back()][j]) dqm.pop_back();
dqx.push_back(i);
dqm.push_back(i);
if (i >= n) {
x[i][j] = mx[dqx.front()][j] - mn[dqm.front()][j];
ans = min(ans, x[i][j]);
}
}
}
printf("%d\n", ans);
return 0;
}