POJ2932 扫描线

来源:互联网 发布:第三方软件测试报告 编辑:程序博客网 时间:2024/05/21 17:19
#include <cstdlib>#include <cstdio>#include <iostream>#include <vector>#include <set>#include <algorithm>using namespace std;double x[400005];double y[400005];double r[400005];int n;int inside(int i,int j){    double dx = x[i] - x[j];    double dy = y[i] - y[j];    return (dx*dx + dy*dy) <= r[j]*r[j];}void solve(){    vector<pair<double,int> > event;    for(int i = 0;i < n;i++){        event.push_back(make_pair(x[i]-r[i],i));        event.push_back(make_pair(x[i]+r[i],i+n));    }    sort(event.begin(),event.end());    set<pair<double,int> > se;    vector<int> res;    for(int i = 0;i < event.size();i++){        int id = event[i].second%n;        if(event[i].second < n){            set<pair<double,int> >::iterator it = se.lower_bound(make_pair(y[id],id));            if(it != se.end() && inside(id,it->second)) continue;            if(it != se.begin() && inside(id,(--it)->second)) continue;            res.push_back(id);            se.insert(make_pair(y[id],id));        }        else{            se.erase(make_pair(y[id],id));        }    }    sort(res.begin(),res.end());    printf("%d\n",res.size());    for(int i = 0;i < res.size();i++){        printf("%d%c",res[i] + 1,(i+1)==res.size() ? '\n' : ' ');    }}int main(){    while(scanf("%d",&n)!=EOF){        for(int i = 0;i < n;i++){            scanf("%lf%lf%lf",&r[i],&x[i],&y[i]);        }        solve();    }    return 0;}

只判断se中的离当前点最近的两个原因是这个里面存放的是当前找到的没有被其他圆包含的的圆,如果有更外部的圆包含当前圆,那么这时候就会出现相交的情况。画个图就能知道了!

0 0
原创粉丝点击