圆的一道扫描线的题
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<string>
#include<set>
#include<vector>
using namespace std;
const int maxn = 40010;
int N;
double x[maxn],y[maxn],r[maxn];
bool 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> > events;
for(int i = 0 ; i < N ; i++)
{
events.push_back(make_pair(x[i]-r[i],i));
events.push_back(make_pair(x[i]+r[i],i+N));
}
sort(events.begin(),events.end());
set<pair<double,int> > outers;
vector<int> res;
for(int i = 0 ; i < events.size() ; i++)
{
int id = events[i].second % N;
if(events[i].second < N)
{
set<pair<double,int> >::iterator it = outers.lower_bound(make_pair(y[id],id));
if(it != outers.end() && inside(id,it->second)) continue;
if(it != outers.begin() && inside(id,(--it)->second)) continue;
res.push_back(id);
outers.insert(make_pair(y[id],id));
}
else
{
outers.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 ",res[i] +1);
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
scanf("%d",&N);
for(int i = 0 ; i < N ; i++)
{
scanf("%lf %lf %lf",&r[i],&x[i],&y[i]);
}
solve();
return 0;
}