#include <bits/stdc++.h>
using namespace std;
typedef long long i64;
struct circle {
int idx;
i64 x, y, r;
};
bool operator<(const circle &u, const circle &v) { return make_pair(-u.r, u.idx) < make_pair(-v.r, v.idx); }
bool sect(const circle &u, const circle &v) { return (u.x - v.x) * (u.x - v.x) + (u.y - v.y) * (u.y - v.y) <= (u.r + v.r) * (u.r + v.r); }
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int N; cin >> N;
multiset<circle> circles;
for (int i = 0; i < N; i++) {
int x, y, r; cin >> x >> y >> r,
circles.insert(circle{i, x + (i64)1e9, y + (i64)1e9, r});
}
vector<int> answer(N);
i64 step = 30;
map<pair<int, int>, vector<multiset<circle>::iterator>> grid;
auto rebuild = [&]() {
grid.clear();
for (auto it = circles.begin(); it != circles.end(); it++)
grid[{it->x >> (step + 1), it->y >> (step + 1)}].push_back(it);
};
while (!circles.empty()) {
circle eliminator = *circles.begin();
answer[eliminator.idx] = eliminator.idx;
while (eliminator.r < step) {
step /= 2;
rebuild();
}
for (int gx = (eliminator.x >> (step + 1)) - 2; gx <= (eliminator.x >> (step + 1)) + 2; gx++) {
for (int gy = (eliminator.y >> (step + 1)) - 2; gy <= (eliminator.y >> (step + 1)) + 2; gy++) {
auto& grid_elems = grid[{gx, gy}];
for (int i = 0; i < grid_elems.size(); i++) {
if (sect(*grid_elems[i], eliminator)) {
answer[grid_elems[i]->idx] = eliminator.idx;
circles.erase(grid_elems[i]);
swap(grid_elems[i], grid_elems.back());
grid_elems.pop_back();
i--;
}
}
}
}
}
for (auto x: answer)
cout << x + 1 << ' ';
cout << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |