题目:奶酪
思路:并查集。
注意:一定要开long long,考场上就是这里挂了两个点。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct Hole{
ll x,y,z;
Hole(){}
Hole(ll xx,ll yy,ll zz){
x=xx,y=yy,z=zz;
}
};
ll n,h,r;
Hole a[1005];
ll fa[1005]={0};
void init(){
for(ll i=1;i<=n;i++) fa[i]=i;
}
ll find(ll x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void Make(ll m,Hole s){
for(ll i=1;i<m;i++){
Hole t=a[i];
if(((double)t.x-s.x)*(t.x-s.x)+(t.y-s.y)*(t.y-s.y)+(t.z-s.z)*(t.z-s.z)<=4*(double)r*r){
ll f1=find(m),f2=find(i);
if(f1!=f2){
fa[f1]=f2;
}
}
}
}
bool checkUp(ll x){
if(a[x].z+r>=h&&a[x].z-r<=h) return true;
return false;
}
bool checkDown(ll x){
if(a[x].z+r>=0&&a[x].z-r<=0) return true;
return false;
}
bool Check(){
vector<ll> vec1,vec2;
for(ll i=1;i<=n;i++){
find(i);
if(checkUp(i)) vec1.push_back(i);
if(checkDown(i)) vec2.push_back(i);
}
for(ll i=0;i<vec1.size();i++){
for(ll j=0;j<vec2.size();j++){
ll x=vec1[i],y=vec2[j];
if(fa[x]==fa[y]) return true;
}
}
return false;
}
int main(){
ll T;
scanf("%lld",&T);
while(T--){
scanf("%lld%lld%lld",&n,&h,&r);
init();
for(ll i=1;i<=n;i++){
ll x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
a[i]=Hole(x,y,z);
Make(i,a[i]);
}
if(Check()) printf("Yes\n");
else printf("No\n");
}
return 0;
}