并查集80分求调
查看原帖
并查集80分求调
1120480
duminghao123楼主2025/7/27 08:28

经计算得(x1x2)2+(y1y2)2+(z1+z2)212×1018(x_1-x_2)^2+(y_1-y_2)^2+(z_1+z_2)^2 \approx 12 \times 10^{18},long long会炸掉,所以我换成了unsigned long long,但仍然是80pts。

#include<bits/stdc++.h>
using namespace std;

int t,n,h,r;
bool flg;

struct ball{
	long long x,y,z,prt;
	bool isu,isd;
}a[1005];

bool ckds(int i,int j,int r){
	unsigned long long dis=pow((a[i].x-a[j].x),2)+pow((a[i].y-a[j].y),2)+pow((a[i].z-a[j].z),2);
	long long dbr=4*r*r;
//	cout<<a[i].x<<" "<<a[j].x<<" "<<a[i].y<<" "<<a[j].y<<" "<<a[i].z<<" "<<a[j].z<<endl;
//	cout<<dis<<" "<<dbr<<endl;
	if(dis<=dbr) return 1;
	else return 0;
}

int find(int i){
	if(a[i].prt==i) return i;
	else return a[i].prt=find(a[i].prt);
}

void un(int i,int j){
	int pr1=find(i);
	int pr2=find(j);
	if(pr1!=pr2){
		a[pr1].prt=pr2;
	}
}

int main(){
	cin>>t;
	for(int i=1;i<=t;i++){
		memset(a,0,sizeof(a));
		cin>>n>>h>>r;
		flg=0;
		for(int j=1;j<=n;j++){
			cin>>a[j].x>>a[j].y>>a[j].z;
			a[j].prt=j;
			if(a[j].z<=r) a[j].isd=1;
			if(a[j].z+r>=h) a[j].isu=1;
			for(int k=1;k<j;k++){
				if(ckds(j,k,r)==1&& find(j) != find(k)){
//					cout<<1<<endl;
					un(j,k);
				}
//				for(int l=1;l<=n;l++) cout<<a[l].prt<<" ";
//				cout<<endl;
			}
		}
		for(int j=1;j<=n;j++){
			for(int k=j;k<=n;k++){
				if(find(j)==find(k)&&((a[j].isd==1&&a[k].isu==1)||(a[j].isu==1&&a[k].isd==1))){
//					cout<<j<<" "<<k<<endl;
					flg=1;
					cout<<"Yes"<<endl;
					break;
				}
			}
			if(flg==1) break;
		}
		if(flg==0) cout<<"No"<<endl;
	}
	return 0;
} 
2025/7/27 08:28
加载中...