This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
typedef long long ll;
typedef long double ld;
using namespace std;
#define F first
#define S second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define SZ(x) (int)(x).size()
#define int ll
const int N = 3e5 + 10;
int x[N], y[N], r[N], ans[N];
bool inter(int id1, int id2) {
return (x[id1] - x[id2]) * (x[id1] - x[id2]) + (y[id1] - y[id2]) * (y[id1] - y[id2]) <= (r[id1] + r[id2]) * (r[id1] + r[id2]);
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
bool group2 = true;
for (int i = 0; i < n; i++) {
cin >> x[i] >> y[i] >> r[i];
if (y[i] != 0) {
group2 = false;
}
}
if (!group2) {
vector<bool> used(n);
int cnt = 0;
while (cnt < n) {
pair<int, int> best = {1e9, 1e9};
for (int i = 0; i < n; i++) {
if (!used[i]) {
best = min(best, make_pair(-r[i], i));
}
}
//cout << best.S + 1 << '\n';
cnt++;
used[best.S] = true;
ans[best.S + 1] = best.S + 1;
for (int i = 0; i < n; i++) {
if (!used[i] && inter(i, best.S)) {
used[i] = true;
ans[i + 1] = best.S + 1;
cnt++;
}
}
}
}
else {
set<pair<int, int>> unused, lef, rig;
for (int i = 0; i < n; i++) {
unused.insert({-r[i], i});
lef.insert({x[i] - r[i], i});
rig.insert({x[i] + r[i], i});
}
while (!unused.empty()) {
int id = unused.begin()->S;
ans[id + 1] = id + 1;
unused.erase(unused.begin());
lef.erase({x[id] - r[id], id});
rig.erase({x[id] + r[id], id});
for (;;) {
auto it = lef.upper_bound(make_pair(x[id] + r[id], 1e9));
if (it == lef.begin()) {
break;
}
it--;
if (it->F < x[id] - r[id]) {
break;
}
ans[it->S + 1] = id + 1;
unused.erase({-r[it->S], it->S});
lef.erase({x[it->S] - r[it->S], it->S});
rig.erase({x[it->S] + r[it->S], it->S});
}
for (;;) {
auto it = rig.lower_bound(make_pair(x[id] - r[id], 0));
if (it == rig.end()) {
break;
}
if (it->F > x[id] + r[id]) {
break;
}
ans[it->S + 1] = id + 1;
unused.erase({-r[it->S], it->S});
lef.erase({x[it->S] - r[it->S], it->S});
rig.erase({x[it->S] + r[it->S], it->S});
}
}
}
for (int i = 1; i <= n; i++) {
cout << ans[i] << ' ';
}
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... |