#C++初学记录(奶酪#并查集)
**原题目:[牛客网](https://ac.nowcoder.com/acm/problem/16417?&headNav=acm)**
**题目描述 :**
现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。我们可以在这块奶酪中建立空间坐标系, 在坐标系中,奶酪的下表面为 z = 0,奶酪的上表面为 z = h。
现在, 奶酪的下表面有一只小老鼠 Jerry, 它知道奶酪中所有空洞的球心所在的坐标。如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别地,如果一个空洞与下表面相切或是相交, Jerry 则可以从奶酪下表面跑进空洞; 如果一个空洞与上表面相切或是相交, Jerry 则可以从空洞跑到奶酪上表面。
位于奶酪下表面的 Jerry 想知道, 在不破坏奶酪的情况下,能否利用已有的空洞跑到奶酪的上表面去?
空间内两点 P1(x1,y1,z1) 、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}
dist(P 1 ,P 2 )= (x 1 −x 2 )2 +(y 1−y 2) 2 +(z 1−z 2) 2**
**输入描述:**
每个输入文件包含多组数据。
输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。
接下来是 T 组数据,每组数据的格式如下:
第一行包含三个正整数 n, h 和 r, 两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。
接下来的 n 行,每行包含三个整数 x, y, z, 两个数之间以一个空格分开, 表示空洞球心坐标为 (x,y,z)。
**输出描述:**
输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i 组数据中, Jerry 能从下表面跑到上表面,则输出“Yes”,如果不能,则输出“No”(均不包含引号)。
**输入描述:**
每个输入文件包含多组数据。
输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。
接下来是 T 组数据,每组数据的格式如下:
第一行包含三个正整数 n, h 和 r, 两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。
接下来的 n 行,每行包含三个整数 x, y, z, 两个数之间以一个空格分开, 表示空洞球心坐标为 (x,y,z)。
**输出描述:**
输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i 组数据中, Jerry 能从下表面跑到上表面,则输出“Yes”,如果不能,则输出“No”(均不包含引号)。
**示例1**
**AC代码**
```
#include
#include
#include
#include
#define N 1005
using namespace std;
int x[N],y[N],z[N],father[N];
bool up[N],down[N],check1[N],check2[N];
void init(int n)
{
int i;
for(i=1;ilong long dist(int i,int j)
{
long long s1=x[i]-x[j];
long long s2=y[i]-y[j];
long long s3=z[i]-z[j];
return s1s1+s2s2+s3*s3;
}
int find(int x)
{
if(father[x]==x) return x;
return father[x]=find(father[x]);
}
void merge(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
father[x]=y;
}
int main()
{
int n,i,j,h,r,t,k;
bool flag;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&h,&r);
init(n);
flag=false;
for(i=1;i<=n;++i)
{
scanf("%d%d%d",&x[i],&y[i],&z[i]);
if(z[i]-r<=0) down[i]=true;
if(z[i]+r>=h) up[i]=true;
if(up[i]&&down[i]) flag=true;
for(j=1;j<i;++j)
if(dist(i,j)<=4ll*r*r)
merge(i,j);
}
for(i=1;i<=n;++i)
{
k=find(i);
if(up[i]&&check2[k]||down[i]&&check1[k])
flag=true;
if(up[i]) check1[k]=true;
if(down[i]) check2[k]=true;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}
<font size=5 face="微软雅黑">**题目理解**
<font size=4 face="微软雅黑">使用并查集或者深度搜索暴力搜都能做出题目,我使用的是并查集方法,学习得到。先将所有洞的集合设置为自己,然后进行判断他们是否相切或者相交,相交就将他们关联起来,并查集中相对简单的题目,代码也相对容易理解。
#C++初学记录(奶酪#并查集)的更多相关文章
- #C++初学记录(并查集)
并查集 题目 今天是伊格那丢的生日.他邀请了很多朋友.现在该吃晚饭了.伊格那丢想知道他至少需要多少张桌子.你必须注意到并不是所有的朋友都认识对方,而且所有的朋友都不想和陌生人待在一起.这个问题的一个重 ...
- NOIP2017 Day2 T1 奶酪(并查集)
题目描述 现有一块大奶酪,它的高度为 hhh ,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为z=0z ...
- 洛谷 P3958 奶酪 并查集
目录 题面 题目链接 题面 题目描述 输入输出格式 输入格式 输出格式: 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P3958 奶酪 题面 题目描述 现有一块大奶酪 ...
- NOIp2017D2T1(luogu3968) 奶酪 (并查集)
并查集. 判相切或相交的时候可以两边同时平方,就不需要double和开根号了. #include<cstdio> #include<cstring> #include<a ...
- 洛谷P3958 奶酪 并查集
两个空洞可互达当且仅当两个空洞相切,即球心距离小于等于球的直径. 一一枚举两个可互达的空洞,并用并查集连起来即可. Code: #include<cstdio> #include<c ...
- codeforces 1023 D. Array Restoration 并查集
D. Array Restoration time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏
算是挺基础的东西 Description 约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱. 游戏开始后,约翰会给贝茜发出P(1≤P ...
- 并查集 (poj 1611 The Suspects)
原题链接:http://poj.org/problem?id=1611 简单记录下并查集的模板 #include <cstdio> #include <iostream> #i ...
- [HNOI2016]最小公倍数 (可回退并查集,回滚莫队)
题面 题目链接 题目描述 给定一张 N N N 个顶点 M M M 条边的无向图(顶点编号为 1 , 2 , - , n 1,2,\ldots,n 1,2,-,n),每条边上带有权值.所有权值都可以分 ...
随机推荐
- 3.用Python画五角星
import turtleimport timeimport os #def draw_square(org_x, org_y, x, y): turtle.setpos(org_x, org_y) ...
- 如何统一管理单个任务下所有API的同步情况?
如何统一管理单个任务下所有API的同步情况 1. 一分钟完成单个API配置 单个API的配置包含:API名称.URL地址.请求方式.参数设置.自定义高级设置. 参数允许用户填写:Text.WebSer ...
- CCProxy代理
只要局域网内有一台机器能够上网,其他机器就可以通过这台机器上安装的CCProxy来代理共享上网,最大程度的减少了硬件费用和上网费用.只需要在服务器上CCProxy代理服务器软件里进行帐号设置,就可以方 ...
- Android为TV端助力之弹出软键盘方式
- 魅族手机使用应用沙盒一键修改imsi数据
较早前文章介绍了怎么在安卓手机上安装激活XPosed框架,XPosed框架的牛逼之处功能各位都介绍过,可以不修改apk的前提下,修改系统内核的参数,打比方在某些应用领域,各位需要修改手机的某个系统参数 ...
- 学习操作系统和Linux内核的新体会
算起来是第三次看内核了吧,要从源码的细节中爬出来: (1)先拎清楚主要的数据结构,就把握住了骨架: (2)再看每个系统调用的功能的流程是如何围绕上述数据结构展开.举个栗子,块设备驱动层的主要数据结构有 ...
- svn 没有killall命令的解决方法 -bash: killall: command not found
debian.ubuntu系统下: apt-get install psmisc centos 下: yum install psmisc
- i++和++i的真正区别
原文:https://blog.csdn.net/c15158032319/article/details/78209740 记得刚开始学编程的时候还是从c语言开始的,还是看的谭浩强写的那本书,上面对 ...
- 从输入 URL 到页面展示到底发生了什么?
1.输入地址 当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全ur ...
- python无法导入自己的模块的解决办法