这道题有一点不理解P3958
查看原帖
这道题有一点不理解P3958
311502
逸之为一楼主2022/5/3 22:12

题目路径

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 ;之后就对了,为什么啊,有大佬知道吗!

2022/5/3 22:12
加载中...