社区讨论

10pts,一个WA,一个AC,剩下的全MLE

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lt1a5i19
此快照首次捕获于
2024/02/25 17:00
2 年前
此快照最后确认于
2024/02/25 19:56
2 年前
查看原帖
CPP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e3+1;

inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while(ch < '0' ||'9' < ch) {
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while('0' <= ch && ch <= '9') {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return x * f;
}

int n, m, k, f1[N][N][11][11], f2[N][N][11][11], lg[N];

void init() {
	lg[1] = 0, lg[2] = 1;
	for (int i = 3; i < N; i ++)
		lg[i] = lg[i / 2] + 1;
	for(int i = 1; i < lg[N - 1]; i ++)
		for(int j = 1; j < lg[N - 1]; j ++)
			for(int x = 1; x + (1 << i) - 1 <= n; x ++)
				for(int y = 1; y + (1 << j) - 1 <= m; y ++)
					f1[x][y][i][j] = max(max(f1[x][y][i - 1][j - 1], f1[x + (1 << i)][y + (1 << j)][i - 1][j - 1]),
									 max(f1[x + (1 << i)][y][i - 1][j - 1], f1[x][y + (1 << j)][i - 1][j - 1]));
	for(int i = 1; i < lg[N - 1]; i ++)
		for(int j = 1; j < lg[N - 1]; j ++)
			for(int x = 1; x + (1 << i) - 1 <= n; x ++)
				for(int y = 1; y + (1 << j) - 1 <= m; y ++)
					f2[x][y][i][j] = min(min(f2[x][y][i - 1][j - 1], f2[x + (1 << i)][y + (1 << j)][i - 1][j - 1]),
									 min(f2[x + (1 << i)][y][i - 1][j - 1], f2[x][y + (1 << j)][i - 1][j - 1]));
}

int query1(int x1, int y1, int x2, int y2) {
	int i = lg[x2 - x1], j = lg[y2 - y1];
	return max(max(f1[x1][y1][i][j], f1[x2 - (1 << i) + 1][y2 - (1 << j) + 1][i][j]), 
			   max(f1[x2 - (1 << i) + 1][y1][i][j], f1[x1][y2 - (1 << j) + 1][i][j]));
}

int query2(int x1, int y1, int x2, int y2) {
	int i = lg[x2 - x1], j = lg[y2 - y1];
	return min(min(f2[x1][y1][i][j], f2[x2 - (1 << i) + 1][y2 - (1 << j) + 1][i][j]), 
			   min(f2[x2 - (1 << i) + 1][y1][i][j], f2[x1][y2 - (1 << j) + 1][i][j]));
}

int main() {
	n = read(), m = read(), k = read();
	for(int i = 1; i <= n; i ++)
		for(int j = 1; j <= m; j ++)
			f1[i][j][0][0] = f2[i][j][0][0] = read();
	init();
	
	int ans = (1 << 30);
	for(int i = 1; i + k - 1 <= n; i ++)
		for(int j = 1; j + k - 1 <= m; j ++)
			ans = min(ans, query1(i, j, i + k - 1, j + k - 1) - query2(i, j, i + k - 1, j + k - 1));
	printf("%d\n", ans);
	return 0;
}

回复

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

正在加载回复...