#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=300010;
int n, cr, x[N], y[N], r[N], a[N], ans[N];
bool chk[N];
map<pair<int, int>, vector<int>> vec;
set<int> st;
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin>>n;
for(int i=1; i<=n; i++) {
cin>>x[i]>>y[i]>>r[i], st.insert(i);
a[i]=i;
}
sort(a+1, a+n+1, [&](int x, int y) {return (r[x]-r[y])?(r[x]>r[y]):(x<y);});
cr=r[a[1]]*2;
for(int i=1; i<=n; i++) if(!chk[a[i]]) {
int k=a[i];
if(r[k]<=cr/2) {
vec.clear();
cr=r[k];
for(int j=1; j<=n; j++) if(!chk[j]) vec[{x[j]/cr, y[j]/cr}].push_back(j);
}
for(int dx=-2; dx<=2; dx++) for(int dy=-2; dy<=2; dy++) if(vec.find({x[k]/cr+dx, y[k]/cr+dy})!=vec.end()) {
vector<int> tmp, tmp2;
swap(tmp, vec[{x[k]/cr+dx, y[k]/cr+dy}]);
for(int j:tmp) {
if((x[j]-x[k])*(x[j]-x[k])+(y[j]-y[k])*(y[j]-y[k])<=(r[k]+r[j])*(r[k]+r[j])) ans[j]=k, chk[j]=true;
else tmp2.push_back(j);
}
swap(tmp2, vec[{x[k]/cr+dx, y[k]/cr+dy}]);
}
}
for(int i=1; i<=n; i++) cout<<ans[i]<<" ";
return 0;
}
# | 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... |