谨以此题来纪念我爆炸的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 奶酪的更多相关文章

  1. 洛谷 P3958 奶酪 并查集

    目录 题面 题目链接 题面 题目描述 输入输出格式 输入格式 输出格式: 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P3958 奶酪 题面 题目描述 现有一块大奶酪 ...

  2. 洛谷P3958 奶酪

    题目链接 这道题貌似可以用BFS来写吧qwq. 我用的是并查集,把联通的洞合并在同一个几何中,最后只需要判断是否存在上表面和下表面有相同集合的洞即可. 但是需要注意的是还有这样的一种情况:有一个大洞贯 ...

  3. 『题解』洛谷P3958 奶酪

    Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 现有一块大奶酪,它的高度为\(h\),它的长度和宽度我们可以认为是无 ...

  4. 洛谷P3958 奶酪 并查集

    两个空洞可互达当且仅当两个空洞相切,即球心距离小于等于球的直径. 一一枚举两个可互达的空洞,并用并查集连起来即可. Code: #include<cstdio> #include<c ...

  5. 洛谷 P3958 奶酪 题解

    思路: 先看哪两个点能互通,再广搜寻找下一步,如果到达高度h就输出Yes,如果所有路径都找过都不能到达高度h就输出No. #include<bits/stdc++.h> using nam ...

  6. 【洛谷p3958】奶酪

    奶酪[题目链接] 题前废话不知道说啥了啊qwq(越来越沉默寡言) 好了看题: SOLUTION: 思路的话,大概是搜索,然后大概广搜??? 但是我们今天写深搜(也是听xcg大佬讲了以后的整理博) 首先 ...

  7. [洛谷P3958] NOIP2017 奶酪

    问题描述 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为z = 0,奶酪 ...

  8. 题解【洛谷P3958】[NOIP2017]奶酪

    题面 题解 我们考虑使用一个并查集维护空洞之间的关系. 如果两个空洞能相互到达,那么它们的祖先也是相同的. 枚举从哪一个空洞开始,能否到达奶酪的上表面. 如果能到达就输出Yes,否则输出No. 注意开 ...

  9. 【深度优先搜索】NOIP2017_D2T1 洛谷3958奶酪

    这道题的写法大体有两种:大法师DFS和并查集,两种算法都不难,本篇博客主要讲解DFS,而且测试数据特水,连个剪枝都不用都可以过. 题目描述[luogu传送门] 现有一块大奶酪,它的高度为 h,它的长度 ...

随机推荐

  1. TP5之数据库备份

    1.效果图 2.下载扩展类(  \extands\org\Baksql.php) 3.在  \public\static  里新建一个data 文件夹用来存放 .sql  的文件 4.使用方法 con ...

  2. 609. Find Duplicate File in System

    Given a list of directory info including directory path, and all the files with contents in this dir ...

  3. 2016CCPC东北地区大学生程序设计竞赛

    吧啦啦啦啦啦啦啦啦啦啦啦能量,ACM,跨!变身!变成一个智障! http://blog.csdn.net/keyboarderqq/article/details/52743062

  4. laravel MVC分布及数据库配置

    laravel MVC分布 M app\Http\Middleware V resources\views C app\Http\Controllers 数据库配置 目录   config\datab ...

  5. ZooKeeper应用案例

    我们通过学习借鉴,哪些项目或应用都使用了ZooKeeper,可以了解我们的应用使用ZooKeeper是否能真正地带来价值,当然,有些项目可能也未必非常适合使用ZooKeeper,我们要批判地学习.借鉴 ...

  6. SpringBoot | Hibernate @Transient 注解

    在默认情况下,持久化类的所有属性会自动映射到数据表的数据列.如果在实际应用中,不想持久保存某些属性,则可以考虑使用@Transient来修饰它们. 如果一个属性并非数据库表的字段映射,就务必将其标示为 ...

  7. H5 之 Page Visibility

    这个是今天刚发现的,想起之前那个在页面用video标签视频播放,别人切换页面后仍在继续播放,体验很不好,用这个API就可以很完美的解决. Page Visibility API 可以让你获取到这种状态 ...

  8. Unity Shader入门精要学习笔记 - 第8章 透明效果

    转载自 冯乐乐的 <Unity Shader入门精要> 透明是游戏中经常要使用的一种效果.在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道.当开启透明混合后,当一个物体被渲染 ...

  9. python flask学习(3)

    这次主要学习web表单.学了下,很像是Django的form表单验证.不过有许多的不同.可以说是功能更加碎块化.Django的验证方式是很固定和严谨的,风格完全不同. 尽管Flask的请求对象提供的对 ...

  10. P1816 忠诚 倍增

    链接:https://www.luogu.org/problem/show?pid=1816 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k ...