rt,样例都没过,思路是二分+dfs,但是一直输出0
#include <cmath>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 5e2 + 10, dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
bitset<maxn> vis[maxn];
int n, l, r, mid, ans, cnt, a[maxn][maxn];
void dfs(int i, int j, int x) {
vis[i][j] = true;
for (int k = 0, ux, uy; k <= 3; k++) {
ux = i + dx[k], uy = j + dy[k];
if (ux < 1 || ux > n || uy < 1 || uy > n || vis[ux][uy] || abs(a[ux][uy] - a[i][j]) > x) continue;
dfs(ux, uy, x);
}
return ;
}
bool check(int x) {
for (int i = 1; i <= n; i++) vis[i].reset();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (vis[i][j]) continue;
dfs(i, j, x);
}
}
cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cnt += vis[i][j];
}
}
return cnt >= (n * n + 1 >> 1);
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
scanf("%d", a[i] + j);
r = max(r, a[i][j]);
}
}
while (l <= r) {
mid = l + r >> 1;
if (check(mid)) {
ans = mid;
r = mid - 1;
} else l = mid + 1;
}
printf("%d\n", ans);
return 0;
}