70分求助,但样例能过
查看原帖
70分求助,但样例能过
352603
RainSpark楼主2022/6/22 09:04

评测记录

1,2,4测试点WA,样例通过

#include<iostream>
#include<cstdio>
#include<cstring>
#define ull unsigned long long
#define ll long long
#define N 1005
using namespace std;
ll x[N],y[N],z[N];
ll f_top[N],f_button[N];
int idx_top,idx_button;
int t,n,h;
ll r;
int father[N];
inline int findfather(int x){//查 
	if(father[x]!=x)
		father[x]=findfather(father[x]);
	return father[x];
}
inline void unionn(int x,int y){//并 
	int a=findfather(x),b=findfather(y);
	if(a!=b)
		father[a]=b;
}
inline bool check(int x,int y){//判 
	return findfather(x)==findfather(y);
}
inline ll dis(ll x1,ll y1,ll z1,
				ll x2,ll y2,ll z2){//距离 
	return (x1-x2)*(x1-x2)+
			(y1-y2)*(y1-y2)+
			(z1-z2)*(z1-z2);
}
void build(int n){//初始化并查集 
	for(int i=1;i<=n;i++)
		father[i]=i;
}
int main(){
	cin>>t;
	while(t--){
		cin>>n>>h>>r;
		build(n);
		idx_top=idx_button=0;
		for(int i=1;i<=n;i++){
			cin>>x[i]>>y[i]>>z[i];
			if(z[i]+r>=h){
				f_top[++idx_top]=i;
			}
			else if(z[i]-r<=0){
				f_button[++idx_button]=i;
			}
			for(int j=1;j<=i;j++){
				if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])>4*r*r){//防止爆炸
					continue;
				}
				if(dis(x[i],y[i],z[i],x[j],y[j],z[j])<=4*r*r){
					unionn(i,j);
				}
			}
		}
		bool res=0;
		for(int i=1;i<=idx_top;i++){
			for(int j=1;j<=idx_button;j++){
				if(check(f_top[i],f_button[j])){
					res=1;
					break;
				}
			}
			if(res){
				break;
			}
		}
		if(res){
			cout<<"Yes"<<endl;
		}else{
			cout<<"No"<<endl;
		}
	}
	return 0;
}


2022/6/22 09:04
加载中...