【題解】LuoGu3958:奶酪

原題傳送門
可以O(n2logn)O(n^2logn)並查集維護兩點之間連通性
把起點和終點也看做兩個點
Code:

#include <bits/stdc++.h>
#define maxn 1010
#define LL long long
using namespace std;
int f[maxn], n;
LL x[maxn], y[maxn], z[maxn], h, r;

inline int read(){
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

int getfa(int k){ return k == f[k] ? k : f[k] = getfa(f[k]); }

void Union(int x, int y){
	int s1 = getfa(x), s2 = getfa(y);
	if (s1 != s2) f[s1] = s2;
}

int main(){
	int T = read();
	while (T--){
		n = read(), h = read(), r = read();
		for (int i = 0; i <= n + 1; ++i)  f[i] = i;
		for (int i = 1; i <= n; ++i){
			x[i] = read(), y[i] = read(), z[i] = read();
			if (z[i] <= r) Union(0, i);
			if (h - z[i] <= r) Union(i, n + 1);
		}
		for (int i = 1; i <= n; ++i)
			for (int j = i + 1; j <= n; ++j)
				if ((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) + (z[i] - z[j]) * (z[i] - z[j]) <= 4LL * r * r) Union(i, j);
		if (getfa(0) == getfa(n + 1)) puts("Yes"); else puts("No");
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章