50tps 6~10全WA 求助!
查看原帖
50tps 6~10全WA 求助!
1025479
LIXE_115楼主2023/10/18 18:50
#include<bits/stdc++.h>
using namespace std;
int T;
int n,h,r;
struct PO{
    int x,y,z;
}t[1006];
int fa[1006];
queue<int>q;
inline int read(){
    int f=1,x=0;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){ x=x*10+ch-48;ch=getchar();}
    return x*f;
}
inline bool dist(int i,int j){
    int sum=sqrt((t[i].x-t[j].x)*(t[i].x-t[j].x)+(t[i].y-t[j].y)*(t[i].y-t[j].y)+(t[i].z-t[j].z)*(t[i].z-t[j].z));
    sum-=2*r;
    if(sum<=0){
        return true;
    }
    else{
        return false;
    }
}
inline void init(){
    for(int i=1;i<=n;i++){
        fa[i]=i;
    }
    while(!q.empty()){
        q.pop();
    }
}
inline int find(int x){
    return x==fa[x]?fa[x]:fa[x]=find(fa[x]);
}
int main(){
    T=read();
    while(T--){
        n=read(),h=read(),r=read();
		init();
        for(int i=1;i<=n;i++){
            t[i].x=read();t[i].y=read();t[i].z=read();
            for(int j=1;j<i;j++){
                // cout<<dist(i,j)<<endl;
                if(dist(i,j)){
                    int a=find(i),b=find(j);
                    // cout<<a<<" "<<b<<"------------"<<endl;
                    if(t[a].z>=t[b].z){
                        fa[b]=a;
                    }
                    else{
                        fa[a]=b;
                    }
                }
            }
            if(t[i].z<=r){
                q.push(i);
            }
        }
        // for(int i=1;i<=n;i++){
        //     cout<<fa[i]<<" ";
        // }
        // cout<<endl;
        if(q.empty()){
            printf("No\n");
            continue;
        }
        while(!q.empty()){
            int it=q.front();
            if(h-t[fa[it]].z<=r){
                printf("Yes\n");
                break;
            }
            q.pop();
        }
        if(q.size()==0){
            printf("No\n");
        }
    }
    return 0;
}

思想就是用并查集,但用z最大的节点做fa,有没有大佬帮帮忙(悲

2023/10/18 18:50
加载中...