NOIP 2017 提高组 K: 奶酪 (SPFA || 并查集)
K: 奶酪
时间限制: 1 Sec 内存限制: 128 MB
提交: 115 解决: 30
[提交][状态][讨论版]
题目描述
现在,奶酪的下表面有一只小老鼠 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,两个数之间以一个空格分开,表示空洞球心坐标为(
输出
样例输入
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 || 并查集)相关推荐
- NOIP 2017 提高组 初赛
NOIP 2017 提高组 初赛 做题感悟. 五.完善程序,是本张试卷最简单的题目,两道题做完,大约花了10分钟.2017-10-17 18:25 对了答案,破天荒,全对. 1.(大整数除法) 有如下 ...
- 【NOIP 2017 提高组】逛公园
[题目] 传送门 题目描述: 策策同学特别喜欢逛公园.公园可以看成一张 nnn 个点 mmm 条边构成的有向图,且没有自环和重边.其中 111 号点是公园的入口,nnn 号点是公园的出口,每条边有一个 ...
- 【NOIP 2017 提高组 DAY1 T1】小凯的疑惑
emmm貌似过不了多久就要去考NOIP了,于是我终于开始刷往年的题了 [题目] 题目描述: 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种 ...
- NOIP 2018提高组复赛C/C++试题及答案详解
NOIP 2018提高组历年真题 CCF NOIP2018 初赛提高组 C++语言试题 第 1 页,共9 页 第二十四届全国青少年信息学奥林匹克联赛初赛 提高组 C++语言试题 竞赛时间:2018 年 ...
- [NOIP 2013提高组]转圈游戏 题解
这题在洛谷上是道黄题,即[普及/提高-] 所以虽然是提高组的,但是其实挺简单的. 我们来看下题面: [NOIP 2013]转圈游戏 刚看到题面作为一个蒟蒻感觉它都不配做黄题,但是直到我看清楚了后发现它 ...
- NOIP 2008 提高组 复赛 message 传字条
NOIP 2008 提高组 复赛 message 传字条 1.样例很快模拟成功,但感觉是凑出来的,没有章法. 2.深度优先遍历,但感觉容易超时. 3.动态规划?翻看他人代码,发现动态规划的写法,确实想 ...
- NOIP 2016 提高组 初赛
NOIP 2016 提高组 初赛 疑难点 学习 感悟. 一. 2.该题81容易看成81次按键,实际是屏幕上出现的第81个字符,实际按键次数超过81次. 3.异或,相同位上,数字相同取0,数字不同取1, ...
- NOIP 2013 提高组 货车运输
描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...
- NOIP 2015 提高组 初赛
NOIP 2015 提高组 初赛 疑难点 学习 感悟. 一. 3. 示例如下(来自自个的理解): 101.101 十进制 转十进制1*10^2+0*10^1+1*10^0+1*10^-1+0*10^- ...
最新文章
- C++ string字符串的比较是否相等
- web页,如何按回车获得焦点,触发web控件事件..?
- gram矩阵的性质_线性代数(十五)标准正交基(Orthonormal Bases)和Gram-Schmidt正交化...
- 中国@代码生成技术@国产
- SpringCloud-Eureka-服务注册是如何发起的
- 可以用计算机进行模拟实验,随着信息技术的发展,包括核实验在内的许多科学研究都可以用计算机进行模拟实验, - 问答库...
- 虚拟内存的配置(页面文件大小)
- linux之openssh配置
- iPhone手机投屏小米盒子
- 仿写京东登录页面HTML/CSS
- Ubuntu下鼠标无法点击解决方案
- 源码方式安装nginx及其依赖并设置服务开机启动
- IETester必备浏览器测试工具
- iphone怎么找本地音乐_为什么iPhone会发出蜂鸣声或振动? 这是找出方法
- MQTT入门2 -- “Error: Invalid password hash for user nick.”和“Connection Refused: not authorised.”...
- 快搜搜:在网上找工作如何防骗!
- 知乎自动化登录(2021.3)
- 戴尔台式计算机怎么安装的,戴尔Dell电脑U盘安装台式机win10系统教程详解
- mysql数据库的在线数据备份与数据恢复
- idea debug图解
热门文章
- python自学流程-Python系统学习流程图,教你一步步学习python
- python代码翻译-用python实现百度翻译的示例代码
- python 画柱状图-Python 使用 matplotlib 画柱状图教程
- 0基础学python-0基础学python 全套教程送你参考
- python turtle画椭圆-【python turtle如何画椭圆】
- python画散点图类型-绘制python中的线和散点图
- python编程有什么用处-python中的生成器是什么?生成器有什么用处?
- python与php8-Python比php发展快的十大理由
- python管理系统-员工管理系统源程序(python实现)
- python编程100例头条-今日头条python面试题之编程篇