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; }