社区讨论
求助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 条回复,欢迎继续交流。
正在加载回复...