洛谷 P3958 奶酪
谨以此题来纪念我爆炸的NOIp2017
这个题虽然很多人说是并查集,但是搜索也是毫无压力的,考场搜索细节写挂,爆了个不上不下的80分。今天无意看到这道题,终于AC
首先这道题要考虑一下精度问题,虽然出题人没有毒瘤的卡精度,但还是要值得注意。解决方法也很简单,去除开方运算,而是将半径平方,即\(2r\) ---> \(4r^2\),这样就OK了。不过要记得用\(\rm long\;long\),不然会爆\(\rm int\)
然后考虑如何搜索,我是将每组数据用前向星存成图,然后搜这张图。这道题有一个很特别的地方,那就是它不用回溯,因为如果一个点到不了终点,那再次搜到的话也还是到不了终点,所以我们为什么要将它再搜一遍呢?直接丢掉就好了
上代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
inline int read() //快读
{
int k=0,f=1;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')f=-1;
for(;isdigit(c);c=getchar())
k=k*10+c-48;
return k*f;
}
struct zzz{ //存空洞的坐标
ll x,
y,
z;
}che[1001];
inline ll f(zzz x,zzz y) //计算空洞距离
{
return (x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y)+(x.z-y.z)*(x.z-y.z);
}
struct hhh{ //存图
int f,
t,
nex;
}e[2000001]; int head[1001]; int tot;
inline void add(int x,int y) //前向星
{
e[++tot].f=x;
e[tot].t=y;
e[tot].nex=head[x];
head[x]=tot;
}
int s[1001],flag; bool en[1001],vis[1001];
//s:可以当作起点的空洞 flag:可以当作起点的空洞的个数 en:终点空洞 vis:这个点是否走过
bool ans; //判断能否到达上表面
void dfs(int str) //搜索主体
{
if(en[str]) //找到终点就不用搜了
{
ans=1; return ;
}
for(int i=head[str];i;i=e[i].nex) //向下寻找能搜的点
if(!vis[e[i].t])
{
vis[e[i].t]=1; //直接标志为搜过,不再回溯
dfs(e[i].t); //向下搜索
if(ans)
return ;
}
}
int main()
{
int t; t=read();
int n; ll h,r;
while(t--)
{
tot=0; memset(head,0,sizeof(head)); ans=0;
flag=0; memset(en,0,sizeof(en)); memset(vis,0,sizeof(vis)); //清空所有变量
n=read(),h=read(),r=read();
for(int i=1;i<=n;i++) //输入数据 + 处理成图
{
che[i].x=read(),che[i].y=read(),che[i].z=read();
if(che[i].z<=r) //如果z>=半径,那么这个空洞和下表面接触,将它加入起点
s[++flag]=i;
if(che[i].z>=h-r) //同理,如果z>=h-r,那它和上表面接触,将它加入终点
en[i]=1;
for(int j=1;j<i;j++)
if(f(che[i],che[j])<=4*r*r) //防止精度损失
{
add(i,j); add(j,i);
}
}
// 搜索 + 输出
bool jjj=0;
for(int i=1;i<=flag;i++)
{
dfs(s[i]);
if(ans)
{
printf("Yes\n");
jjj=1;
break;
}
}
if(!jjj)
printf("No\n");
}
return 0;
}
- 打个广告吧
洛谷 P3958 奶酪的更多相关文章
- 洛谷 P3958 奶酪 并查集
目录 题面 题目链接 题面 题目描述 输入输出格式 输入格式 输出格式: 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P3958 奶酪 题面 题目描述 现有一块大奶酪 ...
- 洛谷P3958 奶酪
题目链接 这道题貌似可以用BFS来写吧qwq. 我用的是并查集,把联通的洞合并在同一个几何中,最后只需要判断是否存在上表面和下表面有相同集合的洞即可. 但是需要注意的是还有这样的一种情况:有一个大洞贯 ...
- 『题解』洛谷P3958 奶酪
Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 现有一块大奶酪,它的高度为\(h\),它的长度和宽度我们可以认为是无 ...
- 洛谷P3958 奶酪 并查集
两个空洞可互达当且仅当两个空洞相切,即球心距离小于等于球的直径. 一一枚举两个可互达的空洞,并用并查集连起来即可. Code: #include<cstdio> #include<c ...
- 洛谷 P3958 奶酪 题解
思路: 先看哪两个点能互通,再广搜寻找下一步,如果到达高度h就输出Yes,如果所有路径都找过都不能到达高度h就输出No. #include<bits/stdc++.h> using nam ...
- 【洛谷p3958】奶酪
奶酪[题目链接] 题前废话不知道说啥了啊qwq(越来越沉默寡言) 好了看题: SOLUTION: 思路的话,大概是搜索,然后大概广搜??? 但是我们今天写深搜(也是听xcg大佬讲了以后的整理博) 首先 ...
- [洛谷P3958] NOIP2017 奶酪
问题描述 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为z = 0,奶酪 ...
- 题解【洛谷P3958】[NOIP2017]奶酪
题面 题解 我们考虑使用一个并查集维护空洞之间的关系. 如果两个空洞能相互到达,那么它们的祖先也是相同的. 枚举从哪一个空洞开始,能否到达奶酪的上表面. 如果能到达就输出Yes,否则输出No. 注意开 ...
- 【深度优先搜索】NOIP2017_D2T1 洛谷3958奶酪
这道题的写法大体有两种:大法师DFS和并查集,两种算法都不难,本篇博客主要讲解DFS,而且测试数据特水,连个剪枝都不用都可以过. 题目描述[luogu传送门] 现有一块大奶酪,它的高度为 h,它的长度 ...
随机推荐
- CSA Round #53 (Div. 2 only) Histogram Partition(模拟)
传送门 题意 给出一个数组A,你有一个数组B(一开始全为0),询问多少次操作后B转化为A 一次操作:选择一段区间,加上某个正整数 分析 构建一个栈, 输入一个数,若当前栈空或栈顶元素比输入小,则加入栈 ...
- 如何实现一个无边框Form的移动和改变大小(二)
接着上文:这里写链接内容 我们来说说一个比较复杂的实现, 效果如图: 注意为了能够凸显没有NC(NotClient)区域,我们额外用了3个panel分别放在窗体的左右和下部.用来模拟客户自己的控件. ...
- P4363 [九省联考2018]一双木棋chess(对抗搜索+记忆化搜索)
传送门 这对抗搜索是个啥玩意儿…… 首先可以发现每一行的棋子数都不小于下一行,且局面可由每一行的棋子数唯一表示,那么用一个m+1进制数来表示当前局面,用longlong存,开map记忆化搜索 然后时间 ...
- [Xcode 实际操作]九、实用进阶-(31)为IAP(支付方式)内购功能的具体实现和测试
目录:[Swift]Xcode实际操作 本文将演示如何为IAP(支付方式)内购功能的具体实现和测试. 内购是苹果市场上的一种常见的盈利方式. 在项目中确保已经安装了第三方库[Pod],双击[Podfi ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 设置Session存活时长
方式一:修改所有的session默认时长,修改tomcat目录下的conf文件夹下的web.xml文件. <session-config> <session-timeout>希 ...
- hyperledger fabric 1.0.5 分布式部署 (七)
fabric 使用 fabric-ca 服务 准备部分 首先需要用户从github上download fabric-ca 的工程代码 cd $GOPATH/src/github.com/hyperle ...
- C 语言实例 - 矩阵转换
C 语言实例 - 矩阵转换 C 语言实例 C 语言实例 矩阵转换. 实例 #include <stdio.h> int main() { ][], transpose[][], r, c, ...
- linux 和windows 的定时任务
linux http://www.cnblogs.com/thinksasa/archive/2013/06/06/3121030.html windows http://www.myhack58.c ...
- 网络请求方法(SDK封装可以替换afn)
//个人觉得 sdk开发时候 最好不要用第三方 最好可以用最原始的方法 替换 此处仅做sdk封装使用 留存+(void)GET:(NSString *)urlStr params:(NSDiction ...
- 图像分类丨浅析轻量级网络「SqueezeNet、MobileNet、ShuffleNet」
前言 深度卷积网络除了准确度,计算复杂度也是考虑的重要指标.本文列出了近年主流的轻量级网络,简单地阐述了它们的思想.由于本人水平有限,对这部分的理解还不够深入,还需要继续学习和完善. 最后我参考部分列 ...