zoukankan      html  css  js  c++  java
  • Luogu P3958奶酪

    不知道为什么只有40分。好吧,是距离公式括号打错了。。。。。。。。。
    距离其实可以不用开根号,直接比较平方大小。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    #include<cmath>
    #define ll long long
    #define N 10001
    using namespace std;
    ll x[N],y[N],z[N],n,h,r;
    int f[N],top,bottom,t;
    int find(int x)
    {
    	if(f[x] == x) return x;
    	return f[x] = find(f[x]);
    }
    double dis(int a,int b)
    {
    	return ((x[a] - x[b])*x[a] - x[b]) + (y[a] - y[b])*(y[a] - y[b]) + (z[a] - z[b])*(z[a] - z[b]);
    }
    int main()
    {
    	scanf("%d",&t);
    	while(t--){
    		scanf("%lld%lld%lld",&n,&h,&r);
    		for(int i = 0;i <= n + 1;++i) f[i] = i;
    		top = n + 1;
    		bottom = 0;
    		for(int i = 1;i <= n;++i)
    		{
    			scanf("%lld%lld%lld",&x[i],&y[i],&z[i]);
    			if(z[i] + r >= h)
    			{
    				f[find(i)] = find(top);
    			}
    			if(z[i] - r <= 0)
    			{
    				f[find(i)] = find(bottom);
    			}
    			for(int j = 1;j < i;++j){
    				if(dis(i,j) <= 4*r*r) 
    				{
    					
    					f[find(i)] = find(j);
    				}
    			}
    		}
    		if(find(top) == find(bottom)) printf("Yes
    ");
    		else printf("No
    ");
    	}
    	return 0;
    }
    

    dalao的题解

    #include<cstdio>
    typedef long long ll;
    const int N=1e3+10;
    int set[N];
    ll n,h,r;
    struct node{
    	ll x,y,z;
    }hole[N];//存点 
    void init()//初始化代表元全为自己 
    {
    	for(int i=0;i<=n+1;i++)
    	set[i]=i;
    }
    int findset(int x)//查找代表元 
    {
    	if(x==set[x])
    	return x;
    	else return set[x]=findset(set[x]);
    }
    void unionset(int x,int y)//并集 
    {
    	int fx=findset(x);
    	int fy=findset(y);
    	set[fy]=fx;
    }
    ll getdis(node a,node b)//返回两点间的距离的平方 
    {
    	return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z);
    }
    int main()
    {
    	//freopen("in.txt","r",stdin);
    	int t,i,j;
    	scanf("%d",&t);
    	while(t--)
    	{
    		scanf("%lld%lld%lld",&n,&h,&r);//此处没写lld扣20 
    		init();
    		int st=0,ed=n+1;//虚拟的起点终点
    		for(i=1;i<=n;i++) 
    		{
    			scanf("%lld%lld%lld",&hole[i].x,&hole[i].y,&hole[i].z);//此处没写lld再扣10 
    			if(hole[i].z<=r)unionset(i,st);//合并起点和i 
    			if(hole[i].z>=h-r)unionset(i,ed);//合并终点和i 
    		}
    		for(i=1;i<=n;i++)
    		for(j=i+1;j<=n;j++)
    		if(getdis(hole[i],hole[j])<=(4*r*r))unionset(i,j);//将相通的点合并 
    		if(findset(st)==findset(ed))printf("Yes
    ");//起点和终点在集合里说明连通 
    		else printf("No
    ");
    	}
    	return 0;
    }
    
    岂能尽如人意,但求无愧我心
  • 相关阅读:
    用友U8远程接入客户端提示启动客户端错误
    oracle 10g 错误 ORA-01653 的解决过程
    用友 凭证引入 如何删除引入的外部凭证
    Delphi实现程序只运行一次并激活已打开的程序
    Delphi Raize的日期控件RzDateTimeEdit星期几不能正确显示的问题
    U8 提示“操作员没有查询权限或视图权限”
    数据库图片存储也读取
    Delph最简单i获取外网IP
    cxgrid 单元格合并
    cocos2d 中使用 pickerView 简单的老虎机应用
  • 原文地址:https://www.cnblogs.com/Zforw/p/10801581.html
Copyright © 2011-2022 走看看