luogu 3958 奶酪

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

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

位于奶酪下表面的 Jerry 想知道,在不破坏奶酪的情况下,能否利用已有的空洞跑 到奶酪的上表面去? 1、用并查集来解决 将上表面和下表面看做0和n+1,从1到n连接各个点, 如果洞和上表面相交或者相切,则连接,如果和下表面相切或者相交,那么连接,最后检查上表面和下表面是不是同一个祖先即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
ll n,h,r;
struct ty{
	ll x;
	ll y;
	ll z;
};
ty a[1005];
int pre[1005];
int find(int x){
	int r=x;
	while(r!=pre[r]){
		r=pre[r];
	}
	int j=x,temp;
	while(pre[j]!=r){
		temp=pre[j];
		pre[j]=r;
		j=temp;
	}
	return r;
}
void merge(int x,int y){
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy){
		pre[fx]=fy;
	}
	return ;
}
int visited[1005];
bool check(int i,int j){
	if((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)<=4*r*r) return true;
	return false;
}
int main(){
	memset(visited,0,sizeof(visited));
	cin>>t;
	while(t--){
		cin>>n>>h>>r;
		for(int i=0;i<=n+1;i++) pre[i]=i;
		for(int i=1;i<=n;i++){
			cin>>a[i].x>>a[i].y>>a[i].z;
			if(a[i].z<=r) merge(0,i);
			if(a[i].z>=h-r) merge(n+1,i);
		}
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++){
				if(check(i,j)){
					merge(i,j);
				}
			}
		}
		if(find(0)==find(n+1)) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}

2、用dfs来解决 找到一个与下表面相交或者相切的点,然后开始从这个点开始遍历各个点,如果出现了与上表面相切或者相交的点,那么就输出Yes,否则输出No。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
ll n,h,r;
struct ty{
	ll x;
	ll y;
	ll z;
};
ty a[1005];
int visited[1005];
vector<int > g;
int flag=0;
bool check(int i,int j){
	if((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)<=4*r*r) return true;
	return false;
}
void dfs(int x){
	if(flag==1) return ;
	if(a[x].z>=h-r){
		flag=1;
		return ;
	}
	visited[x]=1;
	for(int i=1;i<=n;i++){
		if(!visited[i]&&check(x,i)){
			dfs(i);
		}
	}
	return ;
}
int main(){
	cin>>t;
	while(t--){
		g.clear();//记得清除每一次的vector 
		flag=0;
		memset(visited,0,sizeof(visited));
		cin>>n>>h>>r;
		for(int i=1;i<=n;i++){
			cin>>a[i].x>>a[i].y>>a[i].z;
			if(a[i].z<=r) g.push_back(i);//将与小表面相邻的点存入vector中 
		}
		int len=g.size();
		for(int i=0;i<len;i++){
        //每一次dfs的visited数组没有更新为0,因为可以到达上层的路线不会和之前无法到达的路线连通,这样做反而对DFS进行了剪枝,使DFS的搜索次数减少
			if(flag==1) break;
			if(!visited[g[i]]){
				dfs(g[i]);
			}
		}  
		if(flag) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}
全部评论

相关推荐

2025-12-19 21:53
门头沟学院 Java
想做OpenGL:不要一来就把自己定位这么低吧,把大厂当成目标,不断去学技术做项目,最后你至少能学到能找到中小厂的技术水平,你一上来就找这种两千块还要前后端都会的,其实对你用处不会很大,真去了也是打杂
点赞 评论 收藏
分享
不知道怎么取名字_:玩游戏都写到简历上了啊
点赞 评论 收藏
分享
头像
01-12 14:44
已编辑
百度_高级研发工程师
今天看到了某平台攻击牛友的帖子,段段今天打算为牛友们说句话,我们的努力到底有没有意义。&nbsp;(原文复述:感觉牛客就是当年那群做题区毕业了开始找工作还收不住那股味,颇有一种从年级第一掉到年纪第二后抱怨考不上大学的区味)&nbsp;&nbsp;粗鄙,无礼,傲慢,攻击,在这里我没有看到任何有用的分析,我只看到了屁股决定脑袋的攻击,我只看到了嫉妒和眼红。一、去医院不看病你去逛街吗&nbsp;去医院你不去看病你去逛街吗?去加油站不加油你去抽烟吗?去部队你不训练战斗技能你去养老吗?来牛客你不努力求职你来干什么来了。&nbsp;牛客本身就是个求职平台,大家分享有用的知识,分享面经,分享offer,分享求职经验的,来牛客不就干这个来了吗?有什么问题吗?...
给个好点的工作吧啊啊...:不知道我看的是不是和博主同样的帖子,我记得原帖是表达的是有些匿名老是发几十万的offer侮辱价,然后就有牛友觉得凡尔赛了导致后面的评论有些偏激。我觉得这个最近闫学晶那个事情有点类似了,她说他儿子一年只能赚七八十万家庭生活都难以为继,不说普通家庭,多少大厂的程序员都赚不到这个数字,大部分家庭看到这种发言肯定会难受的一p,生活的担子又这么重,人都是需要发泄情绪的,互联网就是个极佳的载体,所以很多人直接就喷她了,人在情绪发泄的时候是不思考的,否则就不叫发泄了。然后还有一个点,段哥假定了这些喷的人全都是“躺平的”,这点可能有失偏颇,很多人一直在努力,但是始终缺乏天时地利人和的某一个条件,这点相信段哥找工作的过程中深有体会。绝大部分人都以结果的失败去否认了努力的全过程,可能只是别人努力的方向错了。就像一次面试,可能你准备了很久,结果面试官就是比较奇葩,一直问没有学习到的领域或知识点,然后有人凭一个挂掉的结果就直接给你扣了一个“躺平”的帽子,觉得挂掉是你不够努力,您心里滋味如何?再说点近点的,我也是od,多少同事深夜无偿加班,涨过一分工资吗?多少外包的技术大牛因为学历被困在外包,连od都进不去,这些人难道不努力吗?只是限制与生活、公司制度等等之类的无奈罢了。说到努力,又想到李家琦79元眉笔事件,这么多年有没有认真工作?有没有涨工资?他嘴里说出来是那么的理所当然,打工牛马都知道“任劳任怨”,“认真工作”真能涨工资?只干活不发声就等着被摘果子吧,企业里永远都是“汇报杰出者”升的最快(当然不是所有企业),这种事情相信段哥包括我甚至大部分od都经历过。最近辞职回老家,和老爸散步每次他都会感慨街上的蔬菜小贩多不容易,他们晚上就窝在那种三轮小货车的驾驶室里,腿都伸不直,我们这里晚上零下了,只盖一条薄毛毯,始终舍不得住我们镇上几十块的酒店,因为一车蔬菜就赚几百块顶多一千而且要卖好久,这样的例子还有太多了。这种芸芸众生可能辛苦了一天之后,打开手机看到网上的凡尔赛发言,跟风喷了几句发泄情绪,我觉得这种人不应该扣上“躺平”的帽子。我觉得大部分正常人都是努力的,或者曾经努力过,但世界上有太多努力解决不了的无奈了,甚至说你都没有那个努力的机会,不过正因如此,才显得坚持不懈的努力奋斗之人的难得可贵,认清生活的真相后仍然热爱生活,敢于直面现实的淋漓。
段段STEADY觉醒与突...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务