poj 2932 Coneology

来源:互联网 发布:有趣的品牌 知乎 编辑:程序博客网 时间:2024/06/05 19:28

依然是圆有关的扫描线.感觉额.上一篇说得自己都看不太懂的样子.

这个题目吧。是要问你有哪个圆没有被其他的圆覆盖住.说白了就是他的被覆盖层数为0.和上一篇的题相比.简单了点。

同样的.没有相交的圆..

啊.直接说做法.加入set的集合的元素是.额.是不相互包含的圆.也就是说两两关系是相离.那么一个圆只要和它上下两圆无关系,自然也不会和这之外的圆有关系了.

然后这里判断一个圆的上下,就没有那么麻烦了.按圆心位置高下来就行.即能和当前圆发生关系的就只有它上下的圆。毕竟加入set的集合的圆都是没有关系的.

额......老是感觉没说清的感觉......

好吧.硬着头皮上我的cuo代码.....set的操作害我RE了好几次...

#include<iostream>#include<cstdio>#include<cstring>#include<set>#include <cmath>#include<algorithm>using namespace std;const int L=50001;const double eps=0.0;struct point{    double x,y,r;    int va,id;}cir[L];struct node{    double x;    int id,flag;}lr[L*2];set<int> seg;typedef set<int>::iterator it;bool cmp(point a,point b){    return a.y<b.y || a.y==b.y && a.x<b.x;}bool cmp1(node a,node b){    return a.x<b.x;}bool pr(point a,point b){    return a.x==b.x && a.y==b.y;}double dis(point a,point b){    a.x-=b.x;a.y-=b.y;    return sqrt(a.x*a.x+a.y*a.y);}int check(point a,point b){    if(pr(a,b))        if(a.r>b.r-eps) return 1;    if(a.r<b.r) return 0;    double d=dis(a,b);    if(d<a.r-b.r-eps) return 1;    return 0;}void slove(int n){    int i,j;    for(i=0;i<n;i++)    {        if(lr[i].flag==0)        {            it idx=seg.insert(lr[i].id).first;            it be=idx,ed=idx;            if(seg.size()>=2)            {                if(be==seg.begin())                {                    j=*++be;                   if(check(cir[j],cir[lr[i].id]))                        {                               cir[lr[i].id].va=1;                            seg.erase(lr[i].id);                        }                }                else if(++ed==seg.end())                {                    j=*--be;                    if(check(cir[j],cir[lr[i].id]))                        {                            cir[lr[i].id].va=1;                            seg.erase(lr[i].id);                        }                }                else                {                    ed--;                    if((check(cir[*--be],cir[lr[i].id])) || (check(cir[*++ed],cir[lr[i].id])))                        {                            cir[lr[i].id].va=1;                            seg.erase(lr[i].id);                        }                }            }        }        else            seg.erase(lr[i].id);    }}int ans[L];int main(){    int i,j,n,m;    while(~scanf("%d",&n))    {        j=0;        for(i=0;i<n;i++)        {            scanf("%lf %lf %lf",&cir[i].r,&cir[i].x,&cir[i].y);            cir[i].id=i;            cir[i].va=0;        }        sort(cir,cir+n,cmp);        for(i=0;i<n;i++)        {            lr[j].id=i;lr[j].x=cir[i].x-cir[i].r;lr[j++].flag=0;            lr[j].id=i;lr[j].x=cir[i].x+cir[i].r;lr[j++].flag=1;        }        sort(lr,lr+j,cmp1);        slove(j);        j=0;        for(i=0;i<n;i++)            if(cir[i].va==0) ans[j++]=cir[i].id+1;        printf("%d\n",j);        sort(ans,ans+j);        for(i=0;i<j;i++)            printf("%d%c",ans[i],i==j-1?'\n':' ');    }    return 0;}


原创粉丝点击