10pts,一个WA,一个AC,剩下的全MLE
查看原帖
10pts,一个WA,一个AC,剩下的全MLE
742157
ZYK_luogu楼主2024/2/25 16:59
#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;
}
2024/2/25 16:59
加载中...