题目链接
题意:有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的使用