调!炸!啦!
查看原帖
调!炸!啦!
923248
Lian_zy楼主2024/5/15 07:27

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;
}
2024/5/15 07:27
加载中...