社区讨论

40分求助dalao,有注释

P3958[NOIP 2017 提高组] 奶酪参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhjlamlu
此快照首次捕获于
2025/11/04 04:25
4 个月前
此快照最后确认于
2025/11/04 04:25
4 个月前
查看原帖
只A了1,2,4,6
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+2;
int t,n,h,r,bot[N],top[N],cnt,cnt2;
int x[N],y[N],z[N],fa[N];
int maxz,minz;
bool fl=0;
long double dist(int x1,int y1,int z1,int x2,int y2,int z2)  {//求空间坐标系中两点距离 distance 
    return (x1-x2)*(x1-x2)*1.000+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2);
}
int find(int x){ //并查集找父亲 
	if(fa[x]!=x) fa[x]=find(fa[x]);
	return fa[x]; 
} 
void merge(int x,int y){
	int fx=find(x);
	int fy=find(y);
	fa[fx]=fy;
}
bool quary(int x,int y){  //检查x,y是否联通 
	int fx=find(x);
	int fy=find(y);
	if(fa[fx]==fa[fy]) return 1;
	else return 0;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--){
		cin>>n>>h>>r;
		minz=0x3f3f3f3f3f3f3f3f;
		maxz=0xcfcfcfcfcfcfcfcf;//
		memset(fa,0,sizeof(fa));
		for(int i=1;i<=n;i++) fa[i]=i;//父亲初始化 
		for(int i=1;i<=n;i++){
			cin>>x[i]>>y[i]>>z[i];
			if(z[i]+r>=h) top[++cnt]=i;
			if(z[i]-r<=0) bot[++cnt2]=i;
			if(z[i]>maxz) maxz=max(z[i],maxz);//最大高度 
			if(z[i]<minz) minz=min(z[i],minz);//最低高度 
		}
//		cout<<maxz<<" "<<minz;
        for(int j=1;j<=n;j++)
		for(int i=j+1;i<=n;i++){
			if(dist(x[i],y[i],z[i],x[j],y[j],z[j])<=2*r*r*2) {
				merge(i,j);
			}
		}
		fl=0;
		if(maxz+r<h||minz-r>0) {
			cout<<"No"<<'\n';//判断顶端和低端是否有空洞 
	    }
	    else{
	    	for(int i=1;i<=cnt;i++){
	    		for(int j=1;j<=cnt2;j++){
	    			if(quary(top[i],bot[i])){
					     cout<<"Yes"<<'\n';
						 fl=1;//判断顶/底端孔洞是否联通 
					     break;
				    }
				}
				if(fl==1) break;
			}
			if(fl==0)
	    	cout<<"No"<<'\n';
		}
	}
	return 0;
} 

/*

1
2 4 1
0 0 1
0 0 3

*/

回复

2 条回复,欢迎继续交流。

正在加载回复...