这么水的题才拿了80分????????????????
QAQ AWSL
sqrt精度问题要注意,最好不开方而去比较平方避免精度问题
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; struct pp{ long long x; long long y; long long z; long long v; }e[60002]; long long t,n,m,res,ans,cnt,num,h,r,u1,d1; int up[60002],down[60002],vis[60002]; long long dis(pp x,pp y ){ return (x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y)+(x.z-y.z)*(x.z-y.z); } bool jud(pp x,pp y){ if(dis(x,y)<=(r*2)*(r*2)) return 1; return 0; } bool dfs(pp x){ vis[x.v]=1; if(up[x.v]) { return 1; } for(int i=1;i<=n;i++){ if(vis[e[i].v]) continue; if(jud(x,e[i])){ if(dfs(e[i])) return 1; } } return 0; } int main(){ scanf("%lld",&t); while(t--){ scanf("%lld%lld%lld",&n,&h,&r); ans=0; d1=0; memset(vis,0,sizeof(vis)); memset(up,0,sizeof(up)); for(int i=1;i<=n;i++){ scanf("%lld%lld%lld",&e[i].x,&e[i].y,&e[i].z); e[i].v=i; if(e[i].z+r>=h) up[i]=1; if(e[i].z-r<=0) down[++d1]=i; } for(int i=1;i<=d1;i++){ if(vis[e[down[i]].v]) continue; if(dfs(e[down[i]])){ ans=1; break; } } if(ans==1) printf("Yes\n"); else printf("No\n"); } return 0; }