社区讨论
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 条回复,欢迎继续交流。
正在加载回复...