纯粹存代码
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>
#include<vector>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<stack>
//#include<memory.h>
#include<ctype.h>
#include<set>
#include<stdio.h>
using namespace std;
typedef long long ll;
#define INF 0x3fffffff
const int maxn = 40000+5;
int n;
double xi[maxn], yi[maxn], ri[maxn];
bool inside(int i, int j) {
double dx = xi[i] - xi[j];
double dy = yi[i] - yi[j];
return dx*dx + dy*dy <= ri[j] * ri[j];
}
void solve() {
vector<pair<double, int> >events;
for (int i = 0; i < n; i++) {
events.push_back(make_pair(xi[i]-ri[i], i));
events.push_back(make_pair(xi[i]+ri[i], n+i));
}
sort(events.begin(), events.end());
set<pair<double, int> > outers;
vector<int> ans;
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(yi[id], id));
if (it != outers.end() && inside(id, it->second))continue;
if (it != outers.begin() && inside(id, (--it)->second))continue;
ans.push_back(id);
outers.insert(make_pair(yi[id], id));
}
else {
outers.erase(make_pair(yi[id], id));
}
}
sort(ans.begin(), ans.end());
printf("%d\n", ans.size());
for (int i = 0; i < ans.size(); i++) {
printf("%d%c", ans[i] + 1, i + 1 == ans.size() ? '\n' : ' ');
}
}
int main() {
cin.sync_with_stdio(false);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> ri[i] >> xi[i] >> yi[i];
}
solve();
}