I WA P3073!
  • 板块灌水区
  • 楼主Lian_zy
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/31 21:26
  • 上次更新2024/3/31 21:50:15
查看原帖
I WA P3073!
923248
Lian_zy楼主2024/3/31 21:26

rt,样例都没过,思路是二分+dfs,但是一直输出00

#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;
}
2024/3/31 21:26
加载中...