JZOJ 5476. 【NOIP2017提高组正式赛】奶酪
Description
现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多 半径相同 的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z = 0,奶酪的上表面为z = h。现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐标。两相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个,特别地,如果一个空洞与下表面相切或是相交,Jerry 则可以从奶酪下表面跑进空洞;如果一个空洞与上表面相切或是相交,Jerry 则可以从空洞跑到奶酪上表面。位于奶酪下表面的 Jerry 想知道,在 不破坏奶酪 的情况下,能否利用已有的空洞跑到奶酪的上表面去?
Input
每个输入文件包含多组数据。输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。接下来是 T 组数据,每组数据的格式如下:第一行包含三个正整数 n,h 和 r,两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。接下来的 n 行,每行包含三个整数 x、y、z,两个数之间以一个空格分开,表示空洞球心坐标为(x,y,z)。
Output
输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i 组数据中,Jerry 能从下表面跑到上表面,则输出“ Yes ”,如果不能,则输出“ No ”(均不包含引号)。
Sample Input
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
Sample Output
Yes
No
Yes
【输入输出样例 1 说明】
第一组数据,由奶酪的剖面图可见:
第一个空洞在(0,0,0)与下表面相切
第二个空洞在(0,0,4)与上表面相切
两个空洞在(0,0,2)相切
输出 Yes
第二组数据,由奶酪的剖面图可见:
两个空洞既不相交也不相切
输出 No
第三组数据,由奶酪的剖面图可见:
两个空洞相交
且与上下表面相切或相交
输出 Yes
Data Constraint
对于 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。
Solution
这题就直接并查集。
把上下边界各看做一个集合,再把那些圆心也看作集合。
之后把能相连的集合并起来即可。
时间复杂度 O(T∗N2∗α(N))O(T*N^2*α(N)) 。
Code
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1005;
struct data
{double x,y,z;
}a[N];
double h,r;
int f[N],size[N];
int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
int get(int x)
{return f[x]==x?x:f[x]=get(f[x]);
}
void merge(int x,int y)
{if(get(x)==get(y)) return;if(size[f[x]]<size[f[y]]) swap(x,y);size[f[x]]+=size[f[y]];f[f[y]]=x;
}
double p(double x)
{return x*x;
}
bool check(int x,int y)
{return sqrt(p(a[x].x-a[y].x)+p(a[x].y-a[y].y)+p(a[x].z-a[y].z))<=2*r;
}
int main()
{int T=read();while(T--){int n=read();h=read(),r=read();int st=n+1,en=n+2;size[f[st]=st]=1,size[f[en]=en]=1;for(int i=1;i<=n;i++){size[f[i]=i]=1;a[i].x=read(),a[i].y=read(),a[i].z=read();if(a[i].z<=r) merge(st,i);if(h-a[i].z<=r) merge(en,i);for(int j=1;j<i;j++)if(check(i,j)) merge(i,j);}if(get(st)==get(en)) printf("Yes\n"); else printf("No\n");}return 0;
}
JZOJ 5476. 【NOIP2017提高组正式赛】奶酪相关推荐
- JZOJ 5475. 【NOIP2017提高组正式赛】逛公园
Description 策策同学特别喜欢逛公园.公园可以看成一张n个点m条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,n号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的 ...
- JZOJ 5478. 【NOIP2017提高组正式赛】列队
Description Sylvia 是一个热爱学习的女孩子.前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m名学生,方阵的行数为 n, ...
- JZOJ 5477. 【NOIP2017提高组正式赛】宝藏
Description 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度.小明决心亲自前往挖掘所有宝藏屋中的 ...
- JZOJ 5473. 【NOIP2017提高组正式赛】小凯的疑惑
Description 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小凯想知道在无法准确支付的物品 ...
- JZOJ 5474. 【NOIP2017提高组正式赛】时间复杂度
Description 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是你的机会来啦!下面请 ...
- 5473. 【NOIP2017提高组正式赛】小凯的疑惑
题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小凯想知道在无法准确支付的物品中,最贵的价值 ...
- 【NOIP2017提高组正式赛】列队
题面 Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m名学生,方阵的行数 ...
- 【NOIP2017 提高组正式赛】列队 题解
题目大意 有一个 \(n\times m\) 的方阵,每次有 \((x,y)\) 离开,离开后有两个命令 向左看齐.这时第一列保持不动,所有学生向左填补空缺.这条指令之后,空位在第 \(x\) 行第 ...
- NOIP2017提高组模拟赛4 (总结)
NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...
最新文章
- zabbix3.4.7版本饼图显示问题
- 别再用kill -9关闭程序了......
- 20220215-CTF-MISC-BUUCTF-爱因斯坦-binwalk分析图片-dd命令分离ZIP文件--图片属性中寻找密码
- CentOS 7 安装 JDK
- mysql gzip_在mysql中存储GZIP:ed文本?
- 电脑操作者的养生之道
- 【作者面对面问答】包邮送《Redis 5设计与源码分析》5本
- 1 数列分块入门_LOJ#6277.数列分块入门1
- 李宏毅 Gradient Descent总结
- [渝粤教育] 中国地质大学 岩石学 复习题
- 介绍打印机脱机的四种恢复方法
- 实证研究使用正交化和自助法寻找显因
- Work Stealing 的运作原理
- Verilog学习:ICE40UP5K_PICO按键点灯
- mac常用基本操作笔记
- 如何禁用笔记本电脑触摸板_您如何永久禁用笔记本电脑上的触摸板?
- 一行代码就能使用PYTHON开发的小游戏
- 基于最新WEB技术的Web SCADA平台构建数字化车间
- 抖音测试像哪个明星的软件,抖音中的测测你像哪位明星特效如何拍摄
- eclipse如何自动生成私有属性变量的get和set方法