这题我提交了十几遍啊。。终于对了啊。。
反正就是最后几个在统计根的时候要用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 ",fa[i],ans[fa[i]].Max,h,ans[fa[i]].Min); 71 } 72 if(ok) printf("Yes "); 73 else printf("No "); 74 } 75 return 0; 76 }