P3958 奶酪

这题我提交了十几遍啊。。终于对了啊。。

反正就是最后几个在统计根的时候要用find统计,不用的话会wa掉两个点

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<stack>
 7 #include<deque>
 8 #include<algorithm>
 9 #define ll long long
10 using namespace std;
11 const int oo=0x3f3f3f3f;
12 const int N=100005;
13 
14 ll T,n,h,r;
15 ll x[N],y[N],z[N],fa[N];
16 struct node{
17     ll Min,Max;
18 }ans[N];
19 
20 ll get(){
21     char zy=getchar();
22     ll z=1,y=0;
23     while(zy>'9'||zy<'0'){
24         if(zy=='-') z=-1;
25         zy=getchar();
26     }
27     while(zy>='0'&&zy<='9'){
28         y=(y<<1)+(y<<3)+zy-'0';
29         zy=getchar();
30     }
31     return z*y;
32 }
33 
34 ll find(ll x){
35     if(fa[x]==x) return x;
36     return fa[x]=find(fa[x]);
37 }
38 
39 ll dist(ll i,ll j){
40     return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]);
41 }
42 
43 int main(){
44     T=get();
45     while(T--){
46         n=get();h=get();r=get();
47         for(ll i=1;i<=n;i++){
48             x[i]=get();y[i]=get();z[i]=get();
49             fa[i]=i;
50             ans[i].Min=z[i]-r;
51             ans[i].Max=z[i]+r;
52         }
53         for(ll i=2;i<=n;i++){
54             for(ll j=i-1;j>=1;j--){
55                 if(dist(i,j)<=4*r*r){
56                     fa[find(i)]=find(j);
57                 }
58             }
59         }
60         for(ll i=1;i<=n;i++){
61             ans[fa[find(i)]].Min=min(ans[fa[find(i)]].Min,z[i]-r);
62             ans[fa[find(i)]].Max=max(ans[fa[find(i)]].Max,z[i]+r);
63         }
64         bool ok=false;
65         for(ll i=1;i<=n;i++){
66             if(ans[fa[find(i)]].Max>=h&&ans[fa[find(i)]].Min<=0){
67                 ok=true;
68                 break;
69             }
70             //printf("%lld %lld %lld %lld\n",fa[i],ans[fa[i]].Max,h,ans[fa[i]].Min);
71         }
72         if(ok) printf("Yes\n");
73         else printf("No\n");
74     }
75     return 0;
76 }

 

posted @ 2019-10-08 22:35  喵呜,颜儿ღ  阅读(119)  评论(0编辑  收藏  举报