社区讨论

求助orz,奶酪那题并查集做法,80分

P3958[NOIP 2017 提高组] 奶酪参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi7cnijn
此快照首次捕获于
2025/11/20 19:30
4 个月前
此快照最后确认于
2025/11/20 19:30
4 个月前
查看原帖
wa了8,9个点。
CPP
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

typedef long long ll;
const int N=1e3+10;
struct hole {
	ll x, y, z;
} hol[N];
int T, n, f[N];
ll h, r;

void init() {
	memset(hol, 0, sizeof(hol));
	for (int i=1; i<=n+1; i++)
		f[i]=i;
	return ;
}

bool cmp(hole a, hole b) {
	return a.z<b.z;
}

int find(int x) {
	if (f[x]==x) return f[x];
	else return f[x]=find(f[x]);
}

bool check(int a, int b) {
	int f1=find(a), f2=find(b);
	if (f1!=f2) return false;
	else return true;
}

void merge(int a, int b) {
	int f1=find(a), f2=find(b);
	f[f2]=f1;
	return ;
}

ll _dis(int a, int b) {
	return (hol[a].x-hol[b].x)*(hol[a].x-hol[b].x)+(hol[a].y-hol[b].y)*(hol[a].y-hol[b].y)+(hol[a].z-hol[b].z)*(hol[a].z-hol[b].z);
}

bool judge(int a, int b) {
	if (_dis(a, b)<=4*r*r) return true;
	else return false; 
} 

int main() {
	cin >> T;
	while (T--) {
		cin >> n >> h >> r;
		init();
		for (int i=1; i<=n; i++)
			cin >> hol[i].x >> hol[i].y >> hol[i].z;
		sort(hol+1, hol+n+1, cmp);
		for (int i=1; i<=n; i++) {
			if (hol[i].z-r>0) break;
			if (hol[i].z-r<=0) merge(0, i);
		}
		for (int i=n; i>=1; i--) {
			if (hol[i].z+r<h) break;
			if (hol[i].z+r>=h) merge(i, n+1);
		}
		for (int i=1; i<=n; i++) {
			for (int j=i+1; j<=n; j++) {
				if (check(i, j)) continue;
				if (judge(i, j)) merge(i, j); 	
			}
		}
		if (check(0, n+1)) cout << "Yes" << endl;
		else cout << "No" << endl;
	}
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...