现在的位置: 首页 > 综合 > 正文

poj 2932 Coneology

2013年04月29日 ⁄ 综合 ⁄ 共 1875字 ⁄ 字号 评论关闭
依然是圆有关的扫描线.感觉额.上一篇说得自己都看不太懂的样子.

这个题目吧。是要问你有哪个圆没有被其他的圆覆盖住.说白了就是他的被覆盖层数为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;
}

抱歉!评论已关闭.