经计算得(x1−x2)2+(y1−y2)2+(z1+z2)2≈12×1018,long long会炸掉,所以我换成了unsigned long long,但仍然是80pts。
#include<bits/stdc++.h>
using namespace std;
int t,n,h,r;
bool flg;
struct ball{
long long x,y,z,prt;
bool isu,isd;
}a[1005];
bool ckds(int i,int j,int r){
unsigned long long dis=pow((a[i].x-a[j].x),2)+pow((a[i].y-a[j].y),2)+pow((a[i].z-a[j].z),2);
long long dbr=4*r*r;
// cout<<a[i].x<<" "<<a[j].x<<" "<<a[i].y<<" "<<a[j].y<<" "<<a[i].z<<" "<<a[j].z<<endl;
// cout<<dis<<" "<<dbr<<endl;
if(dis<=dbr) return 1;
else return 0;
}
int find(int i){
if(a[i].prt==i) return i;
else return a[i].prt=find(a[i].prt);
}
void un(int i,int j){
int pr1=find(i);
int pr2=find(j);
if(pr1!=pr2){
a[pr1].prt=pr2;
}
}
int main(){
cin>>t;
for(int i=1;i<=t;i++){
memset(a,0,sizeof(a));
cin>>n>>h>>r;
flg=0;
for(int j=1;j<=n;j++){
cin>>a[j].x>>a[j].y>>a[j].z;
a[j].prt=j;
if(a[j].z<=r) a[j].isd=1;
if(a[j].z+r>=h) a[j].isu=1;
for(int k=1;k<j;k++){
if(ckds(j,k,r)==1&& find(j) != find(k)){
// cout<<1<<endl;
un(j,k);
}
// for(int l=1;l<=n;l++) cout<<a[l].prt<<" ";
// cout<<endl;
}
}
for(int j=1;j<=n;j++){
for(int k=j;k<=n;k++){
if(find(j)==find(k)&&((a[j].isd==1&&a[k].isu==1)||(a[j].isu==1&&a[k].isd==1))){
// cout<<j<<" "<<k<<endl;
flg=1;
cout<<"Yes"<<endl;
break;
}
}
if(flg==1) break;
}
if(flg==0) cout<<"No"<<endl;
}
return 0;
}