NOIp2017D2T1(luogu3968) 奶酪 (并查集)

并查集。

判相切或相交的时候可以两边同时平方,就不需要double和开根号了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<queue>
 6 #include<cmath>
 7 #include<ctime>
 8 #define LL long long int
 9 #define inf 0x3f3f3f3f
10 #define pw2(x) ((x)*(x))
11 using namespace std;
12 const int maxn=1010;
13 
14 LL rd(){
15    LL x=0;char c=getchar();int neg=1;
16    while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
17    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
18    return x*neg;
19 }
20 
21 LL pos[maxn][3],r,h;
22 int fa[maxn],N;
23 
24 int getf(int x){return x==fa[x]?x:fa[x]=getf(fa[x]);}
25 void add(int a,int b){fa[getf(b)]=getf(a);}
26 
27 
28 inline bool judge(LL x1,LL y1,LL z1,LL x2,LL y2,LL z2){
29     return pw2(x1-x2)+pw2(y1-y2)+pw2(z1-z2)<=pw2(r)*4;
30 }
31 
32 int main(){
33     int i,j,k;
34     for(int t=rd();t;t--){
35         N=rd(),h=rd(),r=rd();
36         for(i=0;i<=N+1;i++) fa[i]=i;
37         for(i=1;i<=N;i++){
38             pos[i][0]=rd(),pos[i][1]=rd(),pos[i][2]=rd();
39             if(fabs(pos[i][2])<=r) add(0,i);
40             if(fabs(pos[i][2]-h)<=r) add(N+1,i);
41         }for(i=1;i<N;i++){
42             for(j=i+1;j<=N;j++){
43                 if(judge(pos[i][0],pos[i][1],pos[i][2],pos[j][0],pos[j][1],pos[j][2])) add(i,j);
44             }
45         }
46         if(getf(0)==getf(N+1)) printf("Yes\n");
47         else printf("No\n");
48     }
49     return 0;
50 }

 

posted @ 2018-09-04 21:09  Ressed  阅读(191)  评论(0编辑  收藏  举报