样例过不了求助
查看原帖
样例过不了求助
664105
BalanceSegment楼主2023/8/20 21:16
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005;
const int mod = 1e9 + 7;
vector<int> e[maxn];
int v[maxn], n, val, cur;
struct point {
	int x, y;
}a[maxn];
int dis(int i, int j) {
	int A = a[i].x - a[j].x;
	int B = a[i].y - a[j].y;
	return abs(A)+ abs(B);
}
bool dfs(int x, int c) {
	v[x] = c;
	for(auto y : e[x]) {
		if(v[y] == c) return 0;
		if(!v[y] && !dfs(y, 3 - c)) return 0;
	}
	return 1;
}
bool check(int mid) {
	for(int i = 0; i <= n; i++) {
		e[i].clear();
		e[i].shrink_to_fit();
	}
	for(int i = 1; i <= n; i++)
		for(int j = 1; j < i; j++) {
			int len = dis(i, j);
			if(len > mid) {
				e[i].push_back(j);
				e[j].push_back(i);
			}
		}
	memset(v, 0, sizeof v);
	int cnt = 0;
	for(int i = 1; i <= n; i++) {
		if(!v[i]) {
			cnt++;
			if(!dfs(i, 1)) return 0;
		}
	}
	val = mid, cur = cnt;
	return 1;
}
int main() {
	cin >> n;
	for(int i = 1; i <= n; i++)
		cin >> a[i].x >> a[i].y;
	int l = 0, r = 10000;
	while(l <= r) {
		int mid = l + r >> 1;
		if(check(mid)) r = mid - 1;
		else l = mid + 1;
	}
	cout << val << endl << cur % mod;
	return 0;
}
2023/8/20 21:16
加载中...