TTTTTTTTTTTTTTT poj 2932 Coneology 平面扫描+STL

题目链接

题意:有n个圆,圆之间不存在相交关系,求有几个不被其他任何圆包含的圆,并输出圆的编号;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
#define MM(a) memset(a,0,sizeof(a))
typedef long long ll;
typedef unsigned long long ULL;
const int mod = 1000000007;
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const int big=50000;
int max(int a,int b) {return a>b?a:b;};
int min(int a,int b) {return a<b?a:b;};
struct circle{
     double x,y,r;
}c[40005];

bool inter(int i,int j)
{
    double dx=c[i].x-c[j].x,dy=c[i].y-c[j].y;
    return dx*dx+dy*dy<=c[j].r*c[j].r;
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        double x,y,r;
        vector<pair<double,int> > events;
        events.clear();
        for(int i=1;i<=n;i++)
        {
            scanf("%lf %lf %lf",&c[i].r,&c[i].x,&c[i].y);
            events.push_back(make_pair(c[i].x-c[i].r,i));
            events.push_back(make_pair(c[i].x+c[i].r,i+n));
        }
        sort(events.begin(),events.end());

        set<pair<double,int> > outers;
        vector<int> ans;
        for(int i=0;i<events.size();i++)
            {
            int id;
            if(events[i].second<=n)
             {
              id=events[i].second;
              set<pair<double,int> >::iterator it=outers.lower_bound(make_pair(c[id].y,id));
              if(it!=outers.end()&&inter(id,it->second)) continue;
              if(it!=outers.begin()&&inter(id,(--it)->second)) continue;
              ans.push_back(id);
              outers.insert(make_pair(c[id].y,id));
             }
            else
             {
                 id=events[i].second-n;
                 outers.erase(make_pair(c[id].y,id));
             }
            }

        sort(ans.begin(),ans.end());
        printf("%d
",ans.size());
        for(int i=0;i<ans.size()-1;i++)
            printf("%d ",ans[i]);
        printf("%d
",ans[ans.size()-1]);
    }
    return 0;
}

  分析:扫描线+set的使用

原文地址:https://www.cnblogs.com/smilesundream/p/5216376.html