从左到右一直扫描。。。。
stl很强大。。。很强大。。嗯就是这样。。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
#define max_n 400005
double x[max_n],y[max_n],r[max_n];
bool judge(int i,int j){ //判断圆i是否在圆j中
double dx=x[i]-x[j];
double dy=y[i]-y[j];
return dx*dx+dy*dy<=r[j]*r[j];
}
int main()
{
int n;
while(~scanf("%d",&n)){
vector< pair<double,int> > q; //pair链接两个数据
for(int i=0;i<n;i++){
scanf("%lf%lf%lf",&r[i],&x[i],&y[i]);
}
for(int i=0;i<n;i++){
q.push_back(make_pair(x[i]-r[i],i)); //圆的左边界
q.push_back(make_pair(x[i]+r[i],i+n)); //圆的右边界
}
sort(q.begin(),q.end());
set<pair<double ,int> > outers; //二叉查找树
vector<int> res; //存放外圆的编号
for(int i=0;i<q.size();i++){
int l=q[i].second%n;
if(q[i].second<n){
set<pair<double ,int> >::iterator it= outers.lower_bound(make_pair(y[l],l));
if(it != outers.end() && judge(l,it->second)) //y边界大于i的圆
continue;
if(it != outers.begin() && judge(l,(--it)->second)) //y边界小于i的圆
continue;
res.push_back(l);
outers.insert(make_pair(y[l],l));
}
else
outers.erase(make_pair(y[l],l));
}
printf("%d\n",res.size());
sort(res.begin(),res.end());
for(int i=0;i<res.size();i++){
printf("%d%c",res[i]+1,i==res.size()-1?'\n':' ');
}
}
return 0;
}