poj 2932 Coneology 扫描线

从左到右一直扫描。。。。

stl很强大。。。很强大。。嗯就是这样。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
#define max_n 400005
double x[max_n],y[max_n],r[max_n];
bool judge(int i,int j){     //判断圆i是否在圆j中
    double dx=x[i]-x[j];
    double dy=y[i]-y[j];
    return dx*dx+dy*dy<=r[j]*r[j];
}
int main()
{
    int n;
    while(~scanf("%d",&n)){
        vector< pair<double,int> > q;   //pair链接两个数据
        for(int i=0;i<n;i++){
            scanf("%lf%lf%lf",&r[i],&x[i],&y[i]);
        }
        for(int i=0;i<n;i++){
            q.push_back(make_pair(x[i]-r[i],i));  //圆的左边界
            q.push_back(make_pair(x[i]+r[i],i+n)); //圆的右边界
        }
        sort(q.begin(),q.end());
        set<pair<double ,int> > outers;    //二叉查找树
        vector<int> res;                   //存放外圆的编号
        for(int i=0;i<q.size();i++){
            int l=q[i].second%n;
            if(q[i].second<n){
                set<pair<double ,int> >::iterator it= outers.lower_bound(make_pair(y[l],l));
                if(it != outers.end() && judge(l,it->second)) //y边界大于i的圆
                continue;
                if(it != outers.begin() && judge(l,(--it)->second))  //y边界小于i的圆
                continue;
                res.push_back(l);
                outers.insert(make_pair(y[l],l));
            }
            else
            outers.erase(make_pair(y[l],l));
        }
        printf("%d\n",res.size());
        sort(res.begin(),res.end());
        for(int i=0;i<res.size();i++){
            printf("%d%c",res[i]+1,i==res.size()-1?'\n':' ');
        }
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值