P3958 [NOIP2017 提高组] 奶酪

 

//if-> else if没有逻辑 
/*
5
1 100 60
70 27 88
1 100 75
80 39 34
1 100 50
605 563 50
1 200 160
120 176 40
1 200 10
50 47 84

No
Yes
Yes
Yes
No
*/

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("----------------------\n");
using namespace std;
const int maxn=1e5+10 ;

ll n,h,r,x[maxn],y[maxn],z[maxn];
int fa[maxn],f1[maxn],f2[maxn],tot1,tot2;

int find(int x){return fa[x]==x? x:fa[x]=find(fa[x]);}
ll dis(int a,int b){ return (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])+(z[a]-z[b])*(z[a]-z[b]);}                          

int main()
{
    ios::sync_with_stdio(false);
    int T;cin>>T;
    while(T--)
    {
        cin>>n>>h>>r;
        tot1=0,tot2=0;
    //    memset(f1,0,sizeof(f1));memset(f2,0,sizeof(f2));
    //    for(int i=1;i<=n;i++) f[i]=i,f1[i]=i,f2[i]=i;
    
        for(int i=1;i<=n;i++){
            cin>>x[i]>>y[i]>>z[i];
            if(z[i]+r>=h) f1[++tot1]=i;
            if(z[i]-r<=0) f2[++tot2]=i;    //else if/if 想清楚逻辑关系 
            fa[i]=i;
        } 
        for(int i=1;i<=n;i++)
            for(int j=1;j<=i;j++){ 
                if(dis(i,j)<=4*r*r){
                    int f1=find(i),f2=find(j);
                    if(f1!=f2) fa[f1]=f2;
                }
            
            }
        
        int flag=0;
        for(int i=1;i<=tot1;i++){
            for(int j=1;j<=tot2;j++)
            {
                if(f1[i]&&f2[j])
                {
                    if(find(f1[i])==find(f2[j])){ 
                        flag=1;break;
                    }
                }
            }
            if(flag==1) break;
        }
        if(flag) cout<<"Yes"<<'\n';
        else cout<<"No"<<'\n';
        
    }
    
    return 0;
}
View Code

 

posted @ 2023-08-20 16:32  JMXZ  阅读(8)  评论(0)    收藏  举报