K: 奶酪

时间限制: 1 Sec  内存限制: 128 MB
提交: 115  解决: 30
[提交][状态][讨论版]

题目描述

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

现在,奶酪的下表面有一只小老鼠 Jerry ,它知道奶酪中所有空洞的球心所在的坐标。如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别地,如果一个空洞与下表面相切或是相交, Jerry 则可以从奶酪下表面跑进空洞;如果一个空洞与上表面相切或是相交, Jerry 则可以从空洞跑到奶酪上表面。

位于奶酪下表面的 Jerry 想知道,在不破坏奶酪的情况下,能否利用已有的空洞跑到奶酪的上表面去 ?

P1(x1,y1,z1)、P2(x_2,y_2,z_2)P2(x2,y2,z2)的距离公式如下:

输入

包含多组数据。 
第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。 
接下来是 T 组数据,每组数据的格式如下: 
第一行包含三个正整数 n,h 和 r,两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。 
接下来的 n 行,每行包含三个整数 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

提示

【题意】

题意很明确  能否从下面到上面

【思路】

转换方向, 就是一个图,   类似于 网络流  有一个 源点 和汇点,  唯一不同的就是  图里面 没有权值,   这样  其实 也可以用并查集, 源点 汇点    看看 最后是否在一个队里, 如果在  那么 就yes  否则 就 no   spfa  好理解,  从源点看看 汇点 可不可达

【代码实现】

SPFA   头文件  什么的 可以忽略~

//#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <math.h>
#include <cstring>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <stdlib.h>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <vector>
#define mem(a,b) memset(a,b,sizeof(a))
#define findx(x) lower_bound(b+1,b+1+bn,x)-b
#define FIN      freopen("input.txt","r",stdin)
#define FOUT     freopen("output.txt","w",stdout)
#define S1(n)    scanf("%d",&n)
#define SL1(n)   scanf("%I64d",&n)
#define S2(n,m)  scanf("%d%d",&n,&m)
#define SL2(n,m)  scanf("%I64d%I64d",&n,&m)
#define Pr(n)     printf("%d\n",n)
#define lson rt << 1, l, mid
#define rson rt << 1|1, mid + 1, r
#define  FI(n) IO::read(n)
#define  Be IO::begin()using namespace std;
typedef long long ll;
const double PI=acos(-1);
const int INF=0x3f3f3f3f;
const double esp=1e-6;
const int maxn=1e5+5;
const int MAXN=50005;
const int MOD=1e9+7;
const int mod=1e9+7;
int dir[5][2]={0,1,0,-1,1,0,-1,0};namespace IO {const int MT = 5e7;char buf[MT]; int c,sz;void begin(){c = 0;sz = fread(buf, 1, MT, stdin);//一次性输入}template<class T>inline bool read(T &t){while( c < sz && buf[c] != '-' && ( buf[c]<'0' || buf[c] >'9')) c++;if( c>=sz) return false;bool flag = 0; if( buf[c]== '-') flag = 1,c++;for( t=0; c<=sz && '0' <=buf[c] && buf[c] <= '9'; c++ ) t= t*10 + buf[c]-'0';if(flag) t=-t;return true;}
}
ll inv[maxn*2];
inline void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){ x=1; y=0; d=a; }else{ ex_gcd(b,a%b,d,y,x); y-=x*(a/b);};}
inline ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}
inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll ans=exgcd(b,a%b,x,y);ll temp=x;x=y;y=temp-a/b*y;return ans;}
inline ll lcm(ll a,ll b){ return b/gcd(a,b)*a;}
inline ll qpow(ll x,ll n){ll res=1;for(;n;n>>=1){if(n&1)res=(res*x)%MOD;x=(x*x)%MOD;}return res;}
inline ll inv_exgcd(ll a,ll n){ll d,x,y;ex_gcd(a,n,d,x,y);return d==1?(x+n)%n:-1;}
inline ll inv1(ll b){return b==1?1:(MOD-MOD/b)*inv1(MOD%b)%MOD;}
inline ll inv2(ll b){return qpow(b,MOD-2);}struct node{ll x,y,z;
}a[MAXN];
struct EDGE{ll v,next;ll w;
}edge[MAXN];
ll head[MAXN],cot;
int st=0,ed=MAXN-5;
int vis[MAXN];
void init()
{cot=0;mem(head,-1);
}
void add(ll u,ll v)
{edge[++cot].v=v;edge[cot].next=head[u];head[u]=cot;edge[++cot].v=u;edge[cot].next=head[v];head[v]=cot;
}
ll dis(ll x,ll y)
{return (pow(a[x].x-a[y].x,2)+pow(a[x].y-a[y].y,2)+pow(a[x].z-a[y].z,2));
}
bool SPFA()
{mem(vis,0);queue<ll>Q;Q.push(st);vis[st]=1;while(!Q.empty()){ll u=Q.front();Q.pop();// vis[u]=0;for(int i=head[u];i!=-1;i=edge[i].next){if(!vis[edge[i].v]){// printf("nest is %d\n",edge[i].v);vis[edge[i].v]=1;Q.push(edge[i].v);}}}
}
int main()
{int T;ll n,h,r;cin>>T;while(T--){init();memset(a,0,sizeof(a));mem(edge,0);scanf("%lld %lld %lld",&n,&h,&r);for(ll i=1;i<=n;i++){scanf("%lld %lld %lld",&a[i].x,&a[i].y,&a[i].z);}for(ll i=1;i<=n;i++){if(r>=a[i].z)add(st,i);if(a[i].z+r>=h)add(i,ed);for(ll j=i+1;j<=n;j++){if(dis(i,j)<= (4*r*r)){//printf("+++ %lld   %lld \n",dis(i,j),2*r);add(i,j);}}}SPFA();if(vis[ed])printf("Yes\n");elseprintf("No\n");}return 0;
}

并查集

//#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <math.h>
#include <cstring>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <stdlib.h>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <vector>
#define mem(a,b) memset(a,b,sizeof(a))
#define findx(x) lower_bound(b+1,b+1+bn,x)-b
#define FIN      freopen("input.txt","r",stdin)
#define FOUT     freopen("output.txt","w",stdout)
#define S1(n)    scanf("%d",&n)
#define SL1(n)   scanf("%I64d",&n)
#define S2(n,m)  scanf("%d%d",&n,&m)
#define SL2(n,m)  scanf("%I64d%I64d",&n,&m)
#define Pr(n)     printf("%d\n",n)
#define lson rt << 1, l, mid
#define rson rt << 1|1, mid + 1, r
#define  FI(n) IO::read(n)
#define  Be IO::begin()using namespace std;
typedef long long ll;
const double PI=acos(-1);
const int INF=0x3f3f3f3f;
const double esp=1e-6;
const int maxn=1e5+5;
const int MAXN=50005;
const int MOD=1e9+7;
const int mod=1e9+7;
int dir[5][2]={0,1,0,-1,1,0,-1,0};namespace IO {const int MT = 5e7;char buf[MT]; int c,sz;void begin(){c = 0;sz = fread(buf, 1, MT, stdin);//一次性输入}template<class T>inline bool read(T &t){while( c < sz && buf[c] != '-' && ( buf[c]<'0' || buf[c] >'9')) c++;if( c>=sz) return false;bool flag = 0; if( buf[c]== '-') flag = 1,c++;for( t=0; c<=sz && '0' <=buf[c] && buf[c] <= '9'; c++ ) t= t*10 + buf[c]-'0';if(flag) t=-t;return true;}
}
ll inv[maxn*2];
inline void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){ x=1; y=0; d=a; }else{ ex_gcd(b,a%b,d,y,x); y-=x*(a/b);};}
inline ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}
inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll ans=exgcd(b,a%b,x,y);ll temp=x;x=y;y=temp-a/b*y;return ans;}
inline ll lcm(ll a,ll b){ return b/gcd(a,b)*a;}
inline ll qpow(ll x,ll n){ll res=1;for(;n;n>>=1){if(n&1)res=(res*x)%MOD;x=(x*x)%MOD;}return res;}
inline ll inv_exgcd(ll a,ll n){ll d,x,y;ex_gcd(a,n,d,x,y);return d==1?(x+n)%n:-1;}
inline ll inv1(ll b){return b==1?1:(MOD-MOD/b)*inv1(MOD%b)%MOD;}
inline ll inv2(ll b){return qpow(b,MOD-2);}int st=0,ed=MAXN-5;
ll h,n,r;
struct node{ll x,y,z;
}a[MAXN];
ll pre[MAXN];
ll finds(ll x)
{return pre[x]==x? x:(pre[x]=finds(pre[x]));
}
void join(ll x,ll y)
{ll fx=finds(x);ll fy=finds(y);//printf("%d is %d | %d is %d\n",x,fx,y,fy);if(fx!=fy)pre[fx]=fy;
}
void init()
{pre[st]=st;pre[ed]=ed;for(ll i=1;i<=n;i++){pre[i]=i;}
}
ll dis(int x,int y)
{return  pow(a[x].x-a[y].x,2)+pow(a[x].y-a[y].y,2)+pow(a[x].z-a[y].z,2);
}
int main()
{int T;cin>>T;while(T--){scanf("%lld %lld %lld",&n,&h,&r);init();for(int i=1;i<=n;i++){scanf("%lld %lld %lld",&a[i].x,&a[i].y,&a[i].z);if(r>=a[i].z){join(i,st);}if(r+a[i].z>=h){join(i,ed);}}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(dis(i,j)<=(4*r*r)){join(i,j);}}}int cot=0;//printf("pres is %d \n",finds(ed));if(finds(st)==finds(ed) )//|| finds(ed)==st)printf("Yes\n");elseprintf("No\n");}return 0;
}

123

转载于:https://www.cnblogs.com/sizaif/p/9078414.html

NOIP 2017 提高组 K: 奶酪 (SPFA || 并查集)相关推荐

  1. NOIP 2017 提高组 初赛

    NOIP 2017 提高组 初赛 做题感悟. 五.完善程序,是本张试卷最简单的题目,两道题做完,大约花了10分钟.2017-10-17 18:25 对了答案,破天荒,全对. 1.(大整数除法) 有如下 ...

  2. 【NOIP 2017 提高组】逛公园

    [题目] 传送门 题目描述: 策策同学特别喜欢逛公园.公园可以看成一张 nnn 个点 mmm 条边构成的有向图,且没有自环和重边.其中 111 号点是公园的入口,nnn 号点是公园的出口,每条边有一个 ...

  3. 【NOIP 2017 提高组 DAY1 T1】小凯的疑惑

    emmm貌似过不了多久就要去考NOIP了,于是我终于开始刷往年的题了 [题目] 题目描述: 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种 ...

  4. NOIP 2018提高组复赛C/C++试题及答案详解

    NOIP 2018提高组历年真题 CCF NOIP2018 初赛提高组 C++语言试题 第 1 页,共9 页 第二十四届全国青少年信息学奥林匹克联赛初赛 提高组 C++语言试题 竞赛时间:2018 年 ...

  5. [NOIP 2013提高组]转圈游戏 题解

    这题在洛谷上是道黄题,即[普及/提高-] 所以虽然是提高组的,但是其实挺简单的. 我们来看下题面: [NOIP 2013]转圈游戏 刚看到题面作为一个蒟蒻感觉它都不配做黄题,但是直到我看清楚了后发现它 ...

  6. NOIP 2008 提高组 复赛 message 传字条

    NOIP 2008 提高组 复赛 message 传字条 1.样例很快模拟成功,但感觉是凑出来的,没有章法. 2.深度优先遍历,但感觉容易超时. 3.动态规划?翻看他人代码,发现动态规划的写法,确实想 ...

  7. NOIP 2016 提高组 初赛

    NOIP 2016 提高组 初赛 疑难点 学习 感悟. 一. 2.该题81容易看成81次按键,实际是屏幕上出现的第81个字符,实际按键次数超过81次. 3.异或,相同位上,数字相同取0,数字不同取1, ...

  8. NOIP 2013 提高组 货车运输

    描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...

  9. NOIP 2015 提高组 初赛

    NOIP 2015 提高组 初赛 疑难点 学习 感悟. 一. 3. 示例如下(来自自个的理解): 101.101 十进制 转十进制1*10^2+0*10^1+1*10^0+1*10^-1+0*10^- ...

最新文章

  1. C++ string字符串的比较是否相等
  2. web页,如何按回车获得焦点,触发web控件事件..?
  3. gram矩阵的性质_线性代数(十五)标准正交基(Orthonormal Bases)和Gram-Schmidt正交化...
  4. 中国@代码生成技术@国产
  5. SpringCloud-Eureka-服务注册是如何发起的
  6. 可以用计算机进行模拟实验,随着信息技术的发展,包括核实验在内的许多科学研究都可以用计算机进行模拟实验, - 问答库...
  7. 虚拟内存的配置(页面文件大小)
  8. linux之openssh配置
  9. iPhone手机投屏小米盒子
  10. 仿写京东登录页面HTML/CSS
  11. Ubuntu下鼠标无法点击解决方案
  12. 源码方式安装nginx及其依赖并设置服务开机启动
  13. IETester必备浏览器测试工具
  14. iphone怎么找本地音乐_为什么iPhone会发出蜂鸣声或振动? 这是找出方法
  15. MQTT入门2 -- “Error: Invalid password hash for user nick.”和“Connection Refused: not authorised.”...
  16. 快搜搜:在网上找工作如何防骗!
  17. 知乎自动化登录(2021.3)
  18. 戴尔台式计算机怎么安装的,戴尔Dell电脑U盘安装台式机win10系统教程详解
  19. mysql数据库的在线数据备份与数据恢复
  20. idea debug图解

热门文章

  1. python自学流程-Python系统学习流程图,教你一步步学习python
  2. python代码翻译-用python实现百度翻译的示例代码
  3. python 画柱状图-Python 使用 matplotlib 画柱状图教程
  4. 0基础学python-0基础学python 全套教程送你参考
  5. python turtle画椭圆-【python turtle如何画椭圆】
  6. python画散点图类型-绘制python中的线和散点图
  7. python编程有什么用处-python中的生成器是什么?生成器有什么用处?
  8. python与php8-Python比php发展快的十大理由
  9. python管理系统-员工管理系统源程序(python实现)
  10. python编程100例头条-今日头条python面试题之编程篇