NOIP2017 Day2 T1 奶酪(并查集)
题目描述
现有一块大奶酪,它的高度为 hhh ,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为z=0z = 0z=0 ,奶酪的上表面为z=hz = hz=h 。
现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐 标。如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别 地,如果一个空洞与下表面相切或是相交,Jerry 则可以从奶酪下表面跑进空洞;如果 一个空洞与上表面相切或是相交,Jerry 则可以从空洞跑到奶酪上表面。
位于奶酪下表面的 Jerry 想知道,在 不破坏奶酪 的情况下,能否利用已有的空洞跑 到奶酪的上表面去?

输入输出格式
输入格式:
每个输入文件包含多组数据。
输入文件的第一行,包含一个正整数 T ,代表该输入文件中所含的数据组数。
接下来是 T 组数据,每组数据的格式如下: 第一行包含三个正整数 n,h 和 r ,两个数之间以一个空格分开,分别代表奶酪中空 洞的数量,奶酪的高度和空洞的半径。
接下来的 n 行,每行包含三个整数 x,y,z ,两个数之间以一个空格分开,表示空 洞球心坐标为(x,y,z) 。
输出格式:
输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i 组数据中,Jerry 能从下 表面跑到上表面,则输出Yes,如果不能,则输出No (均不包含引号)。
输入输出样例
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
说明
【输入输出样例 1 说明】

第一组数据,由奶酪的剖面图可见:
第一个空洞在(0,0,0)与下表面相切
第二个空洞在(0,0,4)与上表面相切 两个空洞在(0,0,2)相切
输出 Yes
第二组数据,由奶酪的剖面图可见:
两个空洞既不相交也不相切
输出 No
第三组数据,由奶酪的剖面图可见:
两个空洞相交 且与上下表面相切或相交
输出 Yes
【数据规模与约定】
对于 20%的数据,n = 1,1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于 40%的数据,1 ≤ n ≤ 8, 1 ≤ h , r ≤ 10,000,坐标的绝对值不超过 10,000。
对于80%的数据,1 ≤ n ≤ 1,000, 1 ≤ h , r ≤ 10,000,坐标的绝对值不超过10,000。
对于 100%的数据,1 ≤ n ≤ 1,000,1 ≤ h , r ≤ 1,000,000,000,T ≤ 20,坐标的绝对值不超过 1,000,000,000。
一道并查集的裸题,注意数据大小,要开long long。为了避免被卡精度,将公式转换。
dist (P1,P2) = sqrt[(x1-x2)^2+(y1-y2)^2+(z1-z2)^2]
dist(P1,P2)^2=(xi-x2)^2+(y1-y2)^2+(z1-z2)^2
这样我们就可以避免被卡精度。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
LL n,h,r;
LL x[],y[],z[],sum[],fa[],ul[],ll[];
LL a[][],dis[][];
LL read()
{
LL x=,w=;char ch=getchar();
while(ch>''||ch<'') {if(ch=='-')w=-;ch=getchar();}
while(ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*w;
}
LL gfa(LL x)
{
if(x==fa[x]) return x;
return fa[x]=gfa(fa[x]);
}
void work20();
void work();
int main()
{
LL t;
t=read();
for(LL w=;w<=t;w++)
{
n=read();h=read();r=read();
for(LL i=;i<=n;i++)
fa[i]=i;
if(n==) work20();
else work();
}
return ;
}
void work20()
{
LL x,y,z;
x=read();y=read();z=read();
if(z-r<=&&z+r>=h)
{
printf("Yes\n");
}
else printf("No\n");
}
void work()
{
LL d,flag=;
LL cnt1=,cnt2=;
for(LL i=;i<=n;i++)
{
x[i]=read();y[i]=read();z[i]=read();
sum[i]=x[i]*x[i]+y[i]*y[i]+z[i]*z[i];
}
for(LL i=;i<=n;i++)
{
for(LL j=;j<i;j++)
{
LL xx=gfa(i),yy=gfa(j);
if(xx!=yy)
{
d=sum[i]+sum[j]-*(x[i]*x[j]+y[i]*y[j]+z[i]*z[j]);
if(d<=*r*r)
{
fa[xx]=yy;
}
}
}
if(z[i]-r<=&&z[i]+r>=h) flag=;
if(z[i]-r<=) ll[++cnt1]=i;
if(z[i]+r>=h) ul[++cnt2]=i;
}
if(!flag)
for(LL i=;i<=cnt1;i++)
{
for(LL j=;j<=cnt2;j++)
{
LL xx=gfa(ll[i]),yy=gfa(ul[j]);
if(xx==yy)
{
flag=;
break;
}
}
if(flag==) break;
}
if(flag==) printf("Yes\n");
else printf("No\n");
}
NOIP2017 Day2 T1 奶酪(并查集)的更多相关文章
- Noip2017 Day2 T1 奶酪
题目描述 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z =0,奶酪的上表面为 ...
- #C++初学记录(奶酪#并查集)
原题目:牛客网 题目描述 : 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞.我们可以在这块奶酪中建立空间坐标系, 在坐标系中,奶酪的下表面为 ...
- 洛谷 P3958 奶酪 并查集
目录 题面 题目链接 题面 题目描述 输入输出格式 输入格式 输出格式: 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P3958 奶酪 题面 题目描述 现有一块大奶酪 ...
- NOIp2017D2T1(luogu3968) 奶酪 (并查集)
并查集. 判相切或相交的时候可以两边同时平方,就不需要double和开根号了. #include<cstdio> #include<cstring> #include<a ...
- 洛谷P3958 奶酪 并查集
两个空洞可互达当且仅当两个空洞相切,即球心距离小于等于球的直径. 一一枚举两个可互达的空洞,并用并查集连起来即可. Code: #include<cstdio> #include<c ...
- loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)
题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...
- LOJ #2877. 「JOISC 2014 Day2」交朋友 并查集+BFS
这种图论问题都挺考验小思维的. 首先,我们把从 $x$ 连出去两条边的都合并了. 然后再去合并从 $x$ 连出去一条原有边与一条新边的情况. 第一种情况直接枚举就行,第二种情况来一个多源 bfs 即可 ...
- noiac26 T1 (并查集)
考虑计算每个位置的数作为最小值时有多少种情况 方便起见,以位置为第二关键字比较大小,这样就不会出现“相同的”数 可以方便地计算出以i位置为最小值的区间端点的可行位置:[A,i],[i,B] 这是我选的 ...
- ZH奶酪:【数据结构与算法】并查集基础
1.介绍 并查集是一种树型数据结构,用于处理一些不相交集合的合并问题. 并查集主要操作有: (1)合并两个不相交集合: (2)判断两个元素是否属于同一个集合: (3)路径压缩: 2.常用操作 用fat ...
随机推荐
- JSP 自动刷新
JSP 自动刷新 想象一下,如果要直播比赛的比分,或股票市场的实时状态,或当前的外汇配给,该怎么实现呢?显然,要实现这种实时功能,您就不得不规律性地刷新页面.JSP提供了一种机制来使这种工作变得简单, ...
- 通过运行窗口输入命令方式,打开Internet窗口
WIN + R 按键, 运行窗口出来后,我们输入‘inetcpl.cpl“,然后按确定. 弹出Interent属性窗口.
- 3D Computer Grapihcs Using OpenGL - 05 EBO
本节将采用两种方法绘制两个三角形. 先看第一种方法的代码 MyGlWindow.cpp #include <gl\glew.h> #include "MyGlWindow.h&q ...
- mvn 与 pom.xml
mvn 安装 wget http://mirrors.hust.edu.cn/apache//maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.t ...
- oracle 表连接 - sort merge joins 排序合并连接
https://blog.csdn.net/dataminer_2007/article/details/41907581一. sort merge joins连接(排序合并连接) 原理 指的是两个表 ...
- 10.1 ‘The server's host key is not cached in the registry’
10.1 ‘The server's host key is not cached in the registry’ This error message occurs when PuTTY conn ...
- JS text节点无innerHTML
在线预览 text节点无innerHTML这个属性!!! 如果直接修改text节点的属性(data,nodeValue,textContent),或者使用js原生的修改text节点的内容的方法都会将H ...
- 005-spring-data-elasticsearch 3.0.0.0使用【三】-spring-data之Spring数据扩展
续 1.8.Spring数据扩展 这些扩展使Spring Data在各种环境下的使用成为可能.目前大部分的整合都是针对Spring MVC. 1.8.1.Querydsl扩展 Querydsl是一个框 ...
- 16/7/8_PHP-字符串介绍
不知道为什么慕课网还这个都要介绍.不过还是一个新的知识点. PHP开发中,我们遇到最多的可能就是字符串. 字符串变量用于包含字符串的值. 一个字符串 通过下面的3种方法来定义: 1.单引号2.双引号3 ...
- Vue Router:使用 props 将组件和路由解耦
在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性. 可以使用 props 将组件和路由解耦. 一 路由配置(布尔模式): impo ...