依然是圆有关的扫描线.感觉额.上一篇说得自己都看不太懂的样子.
这个题目吧。是要问你有哪个圆没有被其他的圆覆盖住.说白了就是他的被覆盖层数为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; }