您的位置:首页 > 其它

洛谷3958 noip2017 奶酪

2018-03-26 17:57 459 查看
题目:奶酪

思路:并查集。

注意:一定要开long long,考场上就是这里挂了两个点。

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

#define ll long long

struct Hole{
ll x,y,z;
Hole(){}
Hole(ll xx,ll yy,ll zz){
x=xx,y=yy,z=zz;
}
};

ll n,h,r;
Hole a[1005];
ll fa[1005]={0};

void init(){
for(ll i=1;i<=n;i++) fa[i]=i;
}

ll find(ll x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}

void Make(ll m,Hole s){
for(ll i=1;i<m;i++){
Hole t=a[i];

if(((double)t.x-s.x)*(t.x-s.x)+(t.y-s.y)*(t.y-s.y)+(t.z-s.z)*(t.z-s.z)<=4*(double)r*r){
ll f1=find(m),f2=find(i);
if(f1!=f2){
fa[f1]=f2;
}
}
}
}

bool checkUp(ll x){
if(a[x].z+r>=h&&a[x].z-r<=h) return true;
return false;
}

bool checkDown(ll x){
if(a[x].z+r>=0&&a[x].z-r<=0) return true;
return false;
}

bool Check(){
vector<ll> vec1,vec2;
for(ll i=1;i<=n;i++){
find(i);
if(checkUp(i)) vec1.push_back(i);
if(checkDown(i)) vec2.push_back(i);
}
for(ll i=0;i<vec1.size();i++){
for(ll j=0;j<vec2.size();j++){
ll x=vec1[i],y=vec2[j];
if(fa[x]==fa[y]) return true;
}
}
return false;
}

int main(){
ll T;
scanf("%lld",&T);
while(T--){
scanf("%lld%lld%lld",&n,&h,&r);
init();
for(ll i=1;i<=n;i++){
ll x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
a[i]=Hole(x,y,z);
Make(i,a[i]);
}
if(Check()) printf("Yes\n");
else printf("No\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并查集