题意


输入
每个输入文件包含多组数据。
输入文件的第一行,包含一个正整数 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

【数据规模与约定】
对于 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

Experience

咬咬手指,扣扣脑袋,( ⊙ o ⊙ )啊!灵光一闪, n 2 n^2 n2建图bfs跑一遍,就可以判是否能到达了。算了算复杂度 n 2 ∗ T n^2*T n2∗T,沉思……应该能卡过去
然后稀里糊涂的写了一发,居然就A了!!!
然而正当我高高兴兴的时候,隔壁大佬cxr凑过来看了一眼,这不是并查集吗?
啥……
并……查……集……
感觉任督二脉突然被打通,一下子就发现自己傻逼了
判连通的话用并查集不就解决了吗???
还是太弱了啊……………………

Analysis

T1还是比较好做的
判两个洞是否相交(或相切)就是看它们球心的距离是否 &lt; = 2 ∗ r &lt;=2*r <=2∗r
如果相交的话就将这两个洞合并(并查集实现)
判断是否和下部(或顶部)相通,就是看球心的位置 + − r +-r +−r是否 &lt; = 0 ∣ ∣ &gt; = h &lt;=0||&gt;=h <=0∣∣>=h
最后就判断一下0和顶部(n+1)是否在同一个集合里就可以了

Code

这个代码是贴的神仙zzh的,(毕竟我不是这样写的)


#include <bits/stdc++.h>
using namespace std;
const int Max=1010;
int t,n,h,r,flag,father[Max];
struct shu{long long x,y,z;};
shu a[Max];
inline int get_int()
{int x=0,f=1;char c;for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());if(c=='-') {f=-1;c=getchar();}for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';return x*f;
}
inline bool comp(const shu &a,const shu &b){return a.z<b.z;}
inline double calc(int i,int j){return sqrt(double(a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)+(a[i].z-a[j].z)*(a[i].z-a[j].z));}
inline int getfather(int v){return father[v]==v ? v : father[v]=getfather(father[v]);}
int main()
{t=get_int();while(t--){memset(a,0,sizeof(a));n=get_int(),h=get_int(),r=get_int();for(int i=1;i<=n;i++) a[i].x=get_int(),a[i].y=get_int(),a[i].z=get_int();sort(a+1,a+n+1,comp);for(int i=1;i<=n;i++) father[i]=i;if(a[n].z+r<h || a[1].z>r) {cout<<"No\n";continue;}for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)if(calc(i,j)<=2*r){int fax=getfather(i),fay=getfather(j);if(fax!=fay) father[fay]=fax;}flag=0;for(int i=n;i>=1;i--){if(flag) break;if(a[i].z+r<h || flag) break;for(int j=1;j<=n;j++){if(a[j].z>r) break;if(getfather(j)==getfather(i)&&a[j].z+r>=0) {flag=1;break;}}}cout<<(flag ? "Yes\n" : "No\n");}return 0;
}

再放一份我的BFS代码
思路清晰,代码好写
(我不要脸)

#include<bits/stdc++.h>
#define in read()
#define N 1009
#define M 2000009
#define ll long long
using namespace std;
inline ll read(){char ch;int f=1;ll res=0;while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;while(ch>='0'&&ch<='9'){res=(res<<3)+(res<<1)+ch-'0';ch=getchar();}return f==1?res:-res;
}
int T;
ll n,h,r;
struct node{double x,y,z;}p[N];
int nxt[M],to[M],head[N],ecnt=0;
bool vis[N];
void add(int x,int y){  nxt[++ecnt]=head[x];head[x]=ecnt;to[ecnt]=y;}
void init(){ecnt=0;memset(head,0,sizeof(head));
}
double Pow(double a) {return a*a;}
double calc(int x,int y){return sqrt(Pow(p[x].x-p[y].x)+Pow(p[x].y-p[y].y)+Pow(p[x].z-p[y].z));
}
bool bfs(){memset(vis,0,sizeof(vis));queue<int> q;q.push(0);while(!q.empty()){int u=q.front();q.pop();for(int e=head[u];e;e=nxt[e]){int v=to[e];if(v==n+1) return 1;if(!vis[v]) q.push(v),vis[v]=1;}}return 0;
}
int main(){T=in;int i,j,k;while(T--){init();n=in;h=in;r=in;for(i=1;i<=n;++i){p[i].x=in;p[i].y=in;p[i].z=in;if(p[i].z-r<=0) add(0,i),add(i,0);if(p[i].z+r>=h) add(n+1,i),add(i,n+1);}for(i=1;i<n;++i)for(j=i+1;j<=n;++j){double dis=calc(i,j);if(dis<=2*r) add(i,j),add(j,i);}if(bfs()) printf("Yes\n");else printf("No\n");}return 0;
}

NOIP2017提高组DAY2T1 - 奶酪相关推荐

  1. 【NOIP2017提高组】奶酪

    奶酪 题目背景 NOIP2017提高组 DAY2 T1 题目描述 现有一块大奶酪,它的高度为h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞.我们可以在这块奶酪中建立空间坐标 ...

  2. [NOIp2017提高组]奶酪(BFS)

    [NOIp2017提高组_Day2T1]奶酪 1 #include<iostream> 2 #include<stdio.h> 3 #include<vector> ...

  3. NOIP2017提高组比赛总结

    NOIP2017提高组比赛总结 前言 转眼间,NOIP2017(经常叫他NOIP,其实全称是全国青少年信息学奥林匹克联赛)就这么过去了.回望这2个月,既有参加NOIP的激动,也有赛场上一些失利的遗憾. ...

  4. P3959 [NOIP2017 提高组] 宝藏

    P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说,就是n个点m个边,选定一个点为根节点,构造一个最小生成树,边的权值为该该边起点到根节点之间的点的数量K(不含根节点) * 道路长度 ...

  5. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

  6. [NOIP2017 提高组] 时间复杂度

    题目 时间复杂度[NOIP2017提高组] 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明 ...

  7. 【NOIP2017提高组】列队

    题目背景 NOIP2017提高组 DAY2 T3 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵.Sylvia 所在的方阵中 ...

  8. P3951 [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目

    [NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目 题目背景 NOIP2017 提高组 D1T1 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每 ...

  9. 【NOIP2017提高组】小凯的疑惑

    小凯的疑惑 题目背景 NOIP2017提高组 DAY1 T1 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无 ...

  10. 洛谷 P3953 [NOIP2017 提高组] 逛公园

    开始刷题单啦~,这部分的洛谷好题作为个人训练记录和以后复习用,有兴趣的可以一起做做 题目链接:P3953 [NOIP2017 提高组] 逛公园 题意都是中文就不翻译了 题解:这是一道记忆化+搜索的题目 ...

最新文章

  1. py02-python基础
  2. 设计模式(简单工厂模式)
  3. 关于linux驱动程序的学习
  4. Oracle 中的SID是什么意思?有什么作用?
  5. JavaScript正则替换去除字符串中特殊字符
  6. 恶意软件“EXPENSIVEWALL”感染数百万台安卓设备
  7. 2018 Multi-University Training Contest 3
  8. 设计灵感|展览海报如何编排?
  9. 基于itchat实现微信群消息同步机器人
  10. 【分布式架构之旅 理论篇】数据库分库分表
  11. 医院耗材管理系统开发_7
  12. 风之大陆ios android账号互通,《风之大陆》安卓和ios互通吗
  13. 利用函数求平均分及方差
  14. 微信公众号开发之用户分组
  15. 毕业设计-校园招聘系统
  16. 11张网络安全思维导图,快收藏!
  17. 单例模式,异常和模块相关
  18. android自定义相机带方框,Android摄像头开发:拍照后添加相框,融合相框和图片为一副 图片...
  19. 快速实现-简单分页器(上)
  20. linux游戏星际公民,鲜游快报:《星际公民》众筹破3.1亿美元 公布新视频展示新机制...

热门文章

  1. keras 香草编码器_2020年的香草指数HTML
  2. POJ 3592 缩点加spfa
  3. 电脑技巧:推荐八个实用的在线学习网站
  4. 【Ubuntu下JAVA安装流程】
  5. 阿里云的大数据技术被用来守护马拉松选手的心脏
  6. stm32F103移植FreeRTOS V10.2.1打印任务堆栈信息和任务运行时间统计
  7. 思绪拾忆20230813
  8. Docker 大势已去,Podman 即将崛起(荣耀典藏版)
  9. mysql建好后如何使用_mysql创造并使用它
  10. HBase的数据读写流程解析