20分,能过样例 求助
查看原帖
20分,能过样例 求助
185527
Raw_Aya9285楼主2020/9/14 13:50
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
ll t,n,h,r,x[1001],y[1001],z[1001];
int f[1001],top[100001],bot[100001],tn=1,bn=1;
bool flag;
int getf(int u){
	if(f[u]!=u)f[u]=getf(f[u]);
	return f[u];
}
ll dis(ll x1,ll x2,ll y1,ll y2,ll z1,ll z2){
	return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
}
int main(){
	scanf("%d",&t);
	while(t--){
		tn=1;bn=1;
		scanf("%lld%lld%lld",&n,&h,&r);
		for(int i=1;i<=n;i++)f[i]=i;
		for(int i=1;i<=n;i++){
			scanf("%lld%lld%lld",&x[i],&y[i],&z[i]);
			if(z[i]+r>=h)top[tn]=i;tn++;
			if(z[i]-r<=0)bot[bn]=i;bn++;
			for(int j=1;j<=i;j++){
				if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])>2*r) continue;
				if(dis(x[i],x[j],y[i],y[j],z[i],z[j])<=2*r){
					int a=getf(i),b=getf(j);
					if(a!=b)f[a]=b;
				}
			}
		}
		flag=0;
		for(int i=1;i<=tn;i++){
			for(int j=1;j<=bn;j++){
				if(getf(top[i])==getf(bot[j])&&getf(top[i]))flag=1;break;
			}
			if(flag)break;
		}
		if(flag)printf("Yes\n");
		else printf("No\n");
		memset(top,0,sizeof(top));
		memset(bot,0,sizeof(top));
	}
	return 0;
}

前两个样例A了后面全WA

目前没有超时

2020/9/14 13:50
加载中...