暴力70分,有点并查集思想,不知哪里错了
查看原帖
暴力70分,有点并查集思想,不知哪里错了
301200
bac0id楼主2021/1/4 21:24

代码如下...有一点注释...

#include<cstdio>
#include<cstring>
#include<ctime>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<string>
#include<set>
#include<map>
using namespace std;
#define ll	long long
#define ld	long double
#define ri	register int
#define rll	register long long
#define rld	register long double
#define rf	register float
#define rd	register double
#define INF	0x7ffffff0
#define MOD	1000000007
#define MODL	1000000007L
#define rep(i,begin,end)	for(int i=begin;i<end;++i)
#define all(x)	x.begin(),x.end()
#define nl()	putchar('\n')

inline ll read(){
    rll x=0L;
    ri c=getchar();
    ll f=1L;
    while(c<'0'||c>'9'){
        if(c=='-')f=-1L;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=x*10L+(c^48);
        c=getchar();
    }
    return x*f;
}
#define MAXN 1100
ll T,n,h,r,mxdis2;
struct Point{
    bool up,dn; //是否和上、下表面相连
    ll x,y,z;
}ps[MAXN];
inline ll pow2(ll x){
    return x*x;
}
inline ll dis2(Point a,Point b){
    return pow2(a.x-b.x)
          +pow2(a.y-b.y)
          +pow2(a.z-b.z);
}
int main(){
    for(T=read();T;--T){
        memset(ps,0,sizeof(ps));
        n=read();h=read();r=read();
        //printf("n=%d h=%d r=%d\n",n,h,r);
        mxdis2=pow2(r<<1); //两个洞相连的球心最大距离r²。距离都用平方算的
        for(ri i=1;i<=n;++i){
            ps[i].x=read();
            ps[i].y=read();
            ps[i].z=read();
            if(ps[i].z+r>=h)ps[i].up=true;
            if(ps[i].z-r<=0)ps[i].dn=true;
            for(ri j=1;j<i;++j){
                //printf("dist <%d,%d> = %d\n",i,j,dis2(ps[i],ps[j]));
                //如果两个洞相连
                if(dis2(ps[i],ps[j])<=mxdis2){
                    //printf("link <%d,%d>\n",i,j);
                    //共享上下表面相连的信息
                    ps[i].up|=ps[j].up; 
                    ps[j].up|=ps[i].up;
                    ps[i].dn|=ps[j].dn;
                    ps[j].dn|=ps[i].dn;
                }
            }
        } 
        //for(ri i=1;i<=n;++i)printf("(%d,%d,%d) up=%d, dn=%d\n",ps[i].x,ps[i].y,ps[i].z,ps[i].up,ps[i].dn);
        bool ok=false;
        for(ri i=1;i<=n;++i){
            if(ps[i].dn&&ps[i].up){
                ok=true;
                break;
            }
        }
        puts(ok?"Yes":"No");
    }
    return 0;
}
2021/1/4 21:24
加载中...