社区讨论
40分求助dalao,有注释
P3958[NOIP 2017 提高组] 奶酪参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjlamlu
- 此快照首次捕获于
- 2025/11/04 04:25 4 个月前
- 此快照最后确认于
- 2025/11/04 04:25 4 个月前
只A了1,2,4,6
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+2;
int t,n,h,r,bot[N],top[N],cnt,cnt2;
int x[N],y[N],z[N],fa[N];
int maxz,minz;
bool fl=0;
long double dist(int x1,int y1,int z1,int x2,int y2,int z2) {//求空间坐标系中两点距离 distance
return (x1-x2)*(x1-x2)*1.000+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2);
}
int find(int x){ //并查集找父亲
if(fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
void merge(int x,int y){
int fx=find(x);
int fy=find(y);
fa[fx]=fy;
}
bool quary(int x,int y){ //检查x,y是否联通
int fx=find(x);
int fy=find(y);
if(fa[fx]==fa[fy]) return 1;
else return 0;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>t;
while(t--){
cin>>n>>h>>r;
minz=0x3f3f3f3f3f3f3f3f;
maxz=0xcfcfcfcfcfcfcfcf;//
memset(fa,0,sizeof(fa));
for(int i=1;i<=n;i++) fa[i]=i;//父亲初始化
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>z[i];
if(z[i]+r>=h) top[++cnt]=i;
if(z[i]-r<=0) bot[++cnt2]=i;
if(z[i]>maxz) maxz=max(z[i],maxz);//最大高度
if(z[i]<minz) minz=min(z[i],minz);//最低高度
}
// cout<<maxz<<" "<<minz;
for(int j=1;j<=n;j++)
for(int i=j+1;i<=n;i++){
if(dist(x[i],y[i],z[i],x[j],y[j],z[j])<=2*r*r*2) {
merge(i,j);
}
}
fl=0;
if(maxz+r<h||minz-r>0) {
cout<<"No"<<'\n';//判断顶端和低端是否有空洞
}
else{
for(int i=1;i<=cnt;i++){
for(int j=1;j<=cnt2;j++){
if(quary(top[i],bot[i])){
cout<<"Yes"<<'\n';
fl=1;//判断顶/底端孔洞是否联通
break;
}
}
if(fl==1) break;
}
if(fl==0)
cout<<"No"<<'\n';
}
}
return 0;
}
/*
1
2 4 1
0 0 1
0 0 3
*/
回复
共 2 条回复,欢迎继续交流。
正在加载回复...