Submission #1158040

#TimeUsernameProblemLanguageResultExecution timeMemory
1158040byunjaewooCircle selection (APIO18_circle_selection)C++20
100 / 100
1493 ms61452 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...