题目链接
题意:有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\n",ans.size()); for(int i=0;i<ans.size()-1;i++) printf("%d ",ans[i]); printf("%d\n",ans[ans.size()-1]); } return 0; }
分析:扫描线+set的使用
原文:http://www.cnblogs.com/smilesundream/p/5216376.html