免费推广网站入口2022,网站后台不显示验证码,建筑设计公司网站模板,抖音代运营的公司记录此题主要是明确两点#xff1a;
强制转long long的时候只会影响乘法#xff0c;如果是加法的话就要在每个乘的前面都加上long long#xff0c;否则无法达到要求。在使用并查集来做连通问题时#xff0c;可以设出两个不影响其他数据的点来代表想要连通的两个地方 现有一…记录此题主要是明确两点
强制转long long的时候只会影响乘法如果是加法的话就要在每个乘的前面都加上long long否则无法达到要求。在使用并查集来做连通问题时可以设出两个不影响其他数据的点来代表想要连通的两个地方 现有一块大奶酪它的高度为 h h h它的长度和宽度我们可以认为是无限大的奶酪中间有许多半径相同的球形空洞。
我们可以在这块奶酪中建立空间坐标系在坐标系中奶酪的下表面为 z 0 z0 z0奶酪的上表面为 z h zh zh。
现在奶酪的下表面有一只小老鼠 J e r r y Jerry Jerry它知道奶酪中所有空洞的球心所在的坐标。
如果两个空洞相切或是相交则 J e r r y Jerry Jerry 可以从其中一个空洞跑到另一个空洞特别地如果一个空洞与下表面相切或是相交 J e r r y Jerry Jerry 则可以从奶酪下表面跑进空洞如果一个空洞与上表面相切或是相交 J e r r y Jerry Jerry 则可以从空洞跑到奶酪上表面。
位于奶酪下表面的 J e r r y Jerry Jerry 想知道在不破坏奶酪的情况下能否利用已有的空洞跑到奶酪的上表面去?
空间内两点 P 1 ( x 1 , y 1 , z 1 ) P_1(x_1,y_1,z_1) P1(x1,y1,z1)、 P 2 ( x 2 , y 2 , z 2 ) P_2(x_2,y_2,z_2) P2(x2,y2,z2) 的距离公式如下
$dist(P_1,P_2)$ $$ $\sqrt{(x_1−x_2)^2(y_1−y_2)^2(z_1−z_2)^2}$ 输入格式 每个输入文件包含多组数据。
输入文件的第一行包含一个正整数 T T T代表该输入文件中所含的数据组数。
接下来是 T T T 组数据每组数据的格式如下
第一行包含三个正整数 n h nh nh 和 r r r两个数之间以一个空格分开分别代表奶酪中空洞的数量奶酪的高度和空洞的半径。
接下来的 n n n 行每行包含三个整数 x 、 y 、 z x、y、z x、y、z两个数之间以一个空格分开表示空洞球心坐标为 ( x , y , z ) (x,y,z) (x,y,z)。
输出格式 输出文件包含 T T T 行分别对应 T T T 组数据的答案如果在第 i i i 组数据中 J e r r y Jerry Jerry 能从下表面跑到上表面则输出 Yes如果不能则输出 No。
数据范围 1 ≤ n ≤ 1000 , 1≤n≤1000, 1≤n≤1000, 1 ≤ h , r ≤ 1 0 9 , 1≤h,r≤10^9, 1≤h,r≤109, T ≤ 20 , T≤20, T≤20, 坐标的绝对值不超过 1 0 9 10^9 109
输入样例
3
2 4 1
0 0 1
0 0 3
2 5 1
0 0 1
0 0 4
2 5 2
0 0 2
2 0 4输出样例
Yes
No
Yes思路建立并查集判断两个球心相差小于等于 2 r 2r 2r 的情况下合并两个集合并且底部用 0 0 0 表示顶部用 n 1 n1 n1 表示最后查询是否有find(0) find(n1)如果有就是连通了。
唯一需要特别注意的一点 判断一个洞是否和底部或是顶部相连时应该将洞看作一个球体即看球心与顶部或底部是否相差了小于等于 r r r 的距离而不是看 z z z 的坐标是否为 0 0 0 或是 h h h 。
代码
#includeiostream
using namespace std;
const int N 1010;
#define acc ios::sync_with_stdio(false);cin.tie(0);int p[N];
struct Node {int x, y, z;
}a[N];
int n, h, r;int find(int x) {if (p[x] ! x) p[x] find(p[x]);return p[x];
}bool check(int i, int j) {long long d1 a[i].x - a[j].x; //这里要开long long不然就在后面乘的时候每个前面都加long longlong long d2 a[i].y - a[j].y; long long d3 a[i].z - a[j].z;if (d1 * d1 d2 * d2 d3 * d3 (long long)r * r * 4)return 1;else return 0;
}int main() {accint t; cin t;while (t--) {cin n h r;for (int i 0; i n 1; i) p[i] i; //初始化并查集for (int i 1; i n; i) {cin a[i].x a[i].y a[i].z;if (abs(a[i].z) r) p[find(i)] find(0); //如果这个洞连上了底部if (h - a[i].z r) p[find(i)] find(n 1); //如果这个洞连上了顶部}for (int i 1; i n; i) {for (int j i 1; j n; j) {if (check(i, j)) {p[find(i)] find(j);}}}if (find(0) find(n 1))cout Yes endl;else cout No endl;}return 0;
}