蓝桥集训之奶酪
-
核心思想:并查集
- 只要两个球有交点 就放到一个并查集中
- 上下边界 为0 和 n+1的并查集 若最终find(0) == find(n+1) 说明上下打通
-
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N = 1010; typedef long long LL; struct node{ int x,y,z; }nodes[N]; int T; int p[N]; int find(int x) { if(p[x]!=x) p[x] = find(p[x]); return p[x]; } int main() { cin>>T; while(T--) { int n,h,r; cin>>n>>h>>r; for(int i=0;i<=n+1;i++) p[i] = i; for(int i=1;i<=n;i++) { int x,y,z; cin>>x>>y>>z; nodes[i] = {x,y,z}; if(abs(z) <= r) p[find(i)] = find(0); //与下界联通 if(abs(z - h) <= r) p[find(i)] = find(n+1); //与上界联通 } for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) { LL dx = nodes[i].x - nodes[j].x; LL dy = nodes[i].y - nodes[j].y; LL dz = nodes[i].z - nodes[j].z; if(dx*dx + dy*dy + dz*dz <= (LL)4*r*r) p[find(i)] = find(j); } } if(find(0) == find(n+1)) puts("Yes"); else puts("No"); } return 0; }