40分代码
#include<bits/stdc++.h>
using namespace std ;
const int Maxs = 50010 , TIL = ( 1 << 28 ) ;
long long X[Maxs] , Y[Maxs] , Z[Maxs] ;
int R[Maxs] , R1 ;
int L[Maxs] , L1 ;
long long r ;
int F[Maxs] ;
int T , N ;
int H ;
int Find(int X) {
if(F[X] == - 1) return X ;
else return F[X] = Find(F[X]) ;
} long long Cmp(long long S) { return S * S ; }
long long Dis(long long X , long long Y , long long Z , long long X1 , long long Y1 , long long Z1) {
return Cmp(abs(X - X1)) + Cmp(abs(Y - Y1)) + Cmp(abs(Z - Z1)) ;
}
long long RMB(long long X , long long Y , long long X1 , long long Y1) {
return Cmp((abs(X - X1)) + Cmp(abs(Y - Y1))) ;
}
int main( ){
freopen( "Std.in" , "r" , stdin ) ;
scanf("%d" , &T) ;
while(T -- ) {
L1 = R1 = 0 ;
scanf("%d%d%lld" , &N , &H , &r) ;
for(int i = 1 ; i <= N ; i ++ ) F[i] = - 1 ;
for(int i = 1 ; i <= N ; i ++ ) {
scanf("%lld%lld%lld" , &X[i] , &Y[i] , &Z[i]) ;
if(Z[i] + r >= H) L[ ++ L1 ] = i ;
if(Z[i] - r <= 0) R[ ++ R1 ] = i ;
int S = Find( i ) ;
for(int l = 1 ; l <= i - 1 ; l ++ ) {
if( Dis(X[i] , Y[i] , Z[i] , X[l] , Y[l] , Z[l]) > Cmp( r * 2 ) ) continue ;
int A = Find( l ) ;
if( A != S ) F[S] = A ;
}
} bool Falg = false ;
for(int l = 1 ; l <= L1 && Falg != true ; l ++ )
for(int i = 1 ; i <= R1 && Falg != true ; i ++ )
if(Find(L[l]) == Find(R[i]))
Falg = true ;
if(Falg == false) printf("No\n") ;
else printf("Yes\n") ;
}
return 0 ;
}
就是用O(N * N * T) 的时间法度 配合并查集做的(可刚开始不知道为什么40分)
可当我将这句 if( A != S ) F[S] = A ; 中的F[S] = A ; 改成F[A] = S ;之后就对了,为什么啊,有大佬知道吗!