1 #include<bits/stdc++.h> //万能头 2 using namespace std; 3 typedef long long ll; 4 const int MAXA = 1010; 5 ll n, h, r; 6 ll x[MAXA], y[MAXA], z[MAXA]; 7 int fa[MAXA]; 8 bool bookup[MAXA], bookdown[MAXA]; //这两个数组存是否与上下表面相通 9 inline void init() 10 { 11 for(register int i = 0; i < MAXA; i++) fa[i] = i; 12 memset(x, 0, sizeof(x)); 13 memset(y, 0, sizeof(y)); 14 memset(z, 0, sizeof(z)); 15 memset(bookup, 0, sizeof(bookup)); 16 memset(bookdown, 0, sizeof(bookdown)); //各种初始化,这边很重要 17 } 18 inline void openFile() 19 { 20 freopen("cheese.in", "r", stdin); 21 freopen("cheese.out", "w", stdout); 22 } 23 inline void closeFile() 24 { 25 fclose(stdin); 26 fclose(stdout); 27 } 28 inline int read() //快读 29 { 30 char ch = getchar(); 31 int temp = 0, fh = 1; 32 while(ch > '9' || ch < '0')if(ch == '-')fh = -1, ch = getchar(); 33 while(ch <= '9' && ch >= '0')temp = temp * 10 + ch - '0', ch = getchar(); 34 return temp * fh; 35 } 36 inline double get_dist(ll x1, ll y1, ll z1, ll x2, ll y2, ll z2) 37 { 38 ll dx = (x1 - x2) * (x1 - x2); 39 ll dy = (y1 - y2) * (y1 - y2); 40 ll dz = (z1 - z2) * (z1 - z2); 41 double temp = sqrt(dx + dy + dz); 42 return temp; 43 //这里请用long long,不然会爆int!!! 44 //话说我旁边那个人就是因为没写long long 100变80.(这个人就差20分一等) 45 //利用公式算距离——其实就是神奇的勾股定理啦 46 } 47 int getf(int n) 48 { 49 if(fa[n] == n) return n; 50 else fa[n] = getf(fa[n]); //路径压缩 51 return fa[n]; 52 //并查集找祖先 顺带路径压缩 53 } 54 inline void toge(int x, int y) //并查集合并 55 { 56 int fx = getf(x), fy = getf(y); 57 if(fx != fy) fa[fy] = fx; 58 if(bookup[fx] || bookup[fy]) bookup[fy] = bookup[fx] = true; 59 if(bookdown[fx] || bookdown[fy])bookdown[fy] = bookdown[fx] = true; 60 //这边两个判断 判断是否和上下表面相同 把结果保存都赋给祖先,直接找祖先就好了 61 } 62 int main() 63 { 64 // openFile(); //文件重定向 65 int t = read(); 66 for(register int i = 1; i <= t; i++) //我知道很多人喜欢写while(t--)但我还是喜欢for没有理由 67 { 68 init(); //每次都要初始化,不然会出锅 69 n = read(); 70 h = read(); 71 r = read(); 72 for(register int j = 1; j <= n; j++) 73 { 74 x[j] = read(); 75 y[j] = read(); 76 z[j] = read(); 77 if(z[j] + r >= h) bookup[getf(j)] = 1; 78 if(z[j] - r <= 0) bookdown[getf(j)] = 1; //判断是否与上下表面相同 79 for(register int k = 1; k < j; k++) 80 { 81 if(getf(k) == getf(j)) continue; //如果已经联通了,再判断是否联通无关紧要 82 double temp = get_dist(x[j], y[j], z[j], x[k], y[k], z[k]); 83 if(temp <= 2 * r) toge(j, k); //每读入一个数就判断是否与之前的联通 84 //这里判断是否联通的比较暴力,复杂度O(n^2) 85 } 86 } 87 bool flag = 0; 88 for(register int i = 1; i <= n; i++) 89 { 90 int faa = getf(i); //这里判断是否有一个联通快能够联通上下表面 91 if(bookup[faa] && bookdown[faa]) 92 { 93 flag = 1; 94 break; 95 } 96 } 97 if(flag) printf("Yes\n"); 98 else printf("No\n"); //输出结果不用多说吧…… 99 } 100 // closeFile(); //取消文件重定向 101 return 0; 102 }