zoukankan      html  css  js  c++  java
  • 奶酪

    emmmm 一道并查集的题
    计算每个球是否相切或者相交 如果是的话归为一个并查集
    然后单独记录一下与上表面相切或者相交的球
    以及与下表面相切或者相交的球

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #define int long long 
    using namespace std;
    const int maxn=1000001;
    int t,n,h,r,f[maxn],top[maxn],bot[maxn];
    int x[maxn],y[maxn],z[maxn];
    
    inline int dis(int i,int j)
    {
    	return(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]);
    }
    
    int find(int x)
    {
    	if(f[x]!=x)	f[x]=find(f[x]);
    	return f[x];		
    }
    
    signed main()
    {
    	scanf("%lld",&t);
    	while(t--)
    	{
    		scanf("%lld %lld %lld",&n,&h,&r);
    		int down=0,head=0;
    		for(int i=1;i<=n;i++)
    			f[i]=i;
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%lld %lld %lld",&x[i],&y[i],&z[i]);
    			if(z[i]+r>=h)
    				top[++head]=i;
    			if(z[i]-r<=0)
    				bot[++down]=i;
    			for(int j=1;j<=i;j++)
    			{
    				int disij;
    				disij=dis(i,j);
    				if(disij>4*r*r)	continue;
    				int fi=find(i),fj=find(j);
    				if(fi!=fj)
    					f[fj]=fi;
    			}
    		}
    		int flag=0;
    		for(int i=1;i<=down;i++)
    		{
    			for(int j=1;j<=head;j++)
    			{
    				if(find(top[j])==find(bot[i]))
    				{
    					flag=1;
    					break;
    				}
    			}
    			if(flag==1)
    				break;
    		}
    		if(flag==1)	printf("Yes
    ");
    		else printf("No
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    Visual Studio2017 无法添加引用的解决方法
    第13周学习进度
    mininet之miniedit可视化操作
    构建之法阅读笔记05
    软件工程课堂练习找水王续
    第12周学习进度
    VS2015做单元测试
    学习调用第三方的WebService服务
    软件工程课堂练习找水王
    第11周学习进度
  • 原文地址:https://www.cnblogs.com/mendessy/p/11688532.html
Copyright © 2011-2022 走看看