码迷,mamicode.com
首页 > 其他好文 > 详细

NOIP 2017 Day2 T1 奶酪

时间:2017-12-23 20:19:56      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:strong   efi   16px   应该   space   printf   noip   targe   show   

luogu题面

两天中唯一的良心题,然而我在考场上蜜汁 RE 成70...

 

做法应该很多,朴素做法应该有 并查集搜索

我打的 并查集,不过好像 DFS 快的一批;

思路很简单,就是把能连在一起的洞并成同一个集

最后要查询一下底面和顶面是否同一集合中;

就完了(好裸啊然而我就是没AC

复杂度 O(n2×T)

 

AC代码如下,个人感觉还比较清晰(244 ms  2183 kb):

 

技术分享图片
#include<bits/stdc++.h>
#define m(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
int f[1002];
struct _{
    int x,y,z;
}a[1002];
inline bool cmp(_ a,_ b){
    return a.z<b.z;
}
inline ll q(ll x){
    return x*x;
}
inline double dis(_ a,_ b){
    return (double)sqrt(q(a.x-b.x)+q(a.y-b.y)+q(a.z-b.z));
}
int find(int x){
    if(f[x]==x) return x;
    return f[x]=find(f[x]);
}
void bing(int a,int b){
    int x=find(a),y=find(b);
    f[x]=y;
}
inline void init(){
    m(a,0),m(f,0);
}
int main(){
    int n,t,h,r;
    scanf("%d",&t);
    while(t--){
        init();
        scanf("%d%d%d",&n,&h,&r);
        for(int i=1;i<=n+1;i++) f[i]=i;
        for(int i=1;i<=n;i++) 
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
        sort(a+1,a+n+1,cmp);
        for(int i=1;i<n;i++)
            for(int j=i+1;j<=n&&a[j].z-(r<<1)<=a[i].z;j++)
                if(dis(a[i],a[j])<=r<<1) bing(i,j);
        for(int i=1;i<=n;i++) if(a[i].z<=r) bing(0,i);
        for(int i=n;i>0;i--) if(a[i].z>=h-r) bing(i,n+1);
        if(find(0)==find(n+1)) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
View Code

 

 

%%% 写 扫描线 的 Dalao %%%

 

By  The_Seventh——一个刚学了半年的高一蒟蒻

2017-12-23 18:08:34

 

NOIP 2017 Day2 T1 奶酪

标签:strong   efi   16px   应该   space   printf   noip   targe   show   

原文地址:http://www.cnblogs.com/TheSeventh/p/8094065.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!