Submission #1158040

#TimeUsernameProblemLanguageResultExecution timeMemory
1158040byunjaewoo원 고르기 (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...