zoukankan      html  css  js  c++  java
  • 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的使用

  • 相关阅读:
    仓储模式Repository
    jwt测试
    net core webapi jwt
    net core发布到iis遇到的困难
    新的目标
    L9-2.安装mysql数据库
    L9-1-安装Apache
    L8_2
    Linux 08
    Linux 07 故障恢复
  • 原文地址:https://www.cnblogs.com/smilesundream/p/5216376.html
Copyright © 2011-2022 走看看