社区讨论

0分求条

P2216[HAOI2007] 理想的正方形参与者 3已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@lrvjfur4
此快照首次捕获于
2024/01/27 11:54
2 年前
此快照最后确认于
2024/01/27 14:40
2 年前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;

int a, b, n, c[1001][1001], q[1001], front = 1, rear = 0, Min[1001][1001], Max[1001][1001], len1, len2;
int tmp1[1001], tmp2[1001], p[1001], r[1001];

void work1(int c[], int d[], int l) {
	front = 1, rear = 0;
	len1 = 0;
	for (int i = 1; i <= l; i++) {
		while (front <= rear && c[q[rear]] >= c[i])
			rear--;
		q[++rear] = i;
		if (q[front] < i - n + 1)
			front++;
		if (i >= n)
			d[++len1] = c[q[front]];
	}
}

void work2(int c[], int d[], int l) {
	front = 1, rear = 0;
	len2 = 0;
	for (int i = 1; i <= l; i++) {
		while (front <= rear && c[q[rear]] <= c[i])
			rear--;
		q[++rear] = i;
		if (q[front] < i - n + 1)
			front++;
		if (i >= n)
			d[++len2] = c[q[front]];
	}
}

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 >> c[i][j];
	for (int i = 1; i <= a; i++) {
		work1(c[i], Min[i], b);
		work2(c[i], Max[i], b);
	}
	int ans = 0x3f3f3f3f;
	for (int i = 1; i <= len1; i++) {
		for (int j = 1; j <= a; j++)
			tmp1[i] = Min[j][i], tmp2[i] = Max[j][i];
		int tmp = len1;
		work1(tmp1, p, tmp);
		work2(tmp2, r, tmp);
		int minn = 0x3f3f3f3f, maxx = -0x3f3f3f3f;
		for (int j = 1; j <= len1; j++)
		    ans = min(ans, r[j] - p[j]);
	}
	cout << ans << '\n';
	return 0;
}

回复

12 条回复,欢迎继续交流。

正在加载回复...