Submission #1205619

#TimeUsernameProblemLanguageResultExecution timeMemory
120561912345678원 고르기 (APIO18_circle_selection)C++17
100 / 100
823 ms63272 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

const ll nx=3e5+5, inf=1e18, cns=1e9;

ll n, x[nx], y[nx], r[nx], res[nx], scaling=inf;
set<pair<ll, ll>> s;
map<ll, vector<pair<ll, ll>>> mp;

void rescale()
{
    mp.clear();
    for (int i=1; i<=n; i++) if (!res[i]) mp[x[i]/scaling].push_back({y[i]/scaling, i});
    for (auto &[x, y]:mp) sort(y.begin(), y.end());
}

void solve()
{
    auto cur=*prev(s.end());
    int idx=-cur.second;
    if (2*cur.first<=scaling) scaling=cur.first, rescale();
    for (auto itr=mp.lower_bound(x[idx]/scaling-2); itr!=mp.end()&&abs(itr->first-x[idx]/scaling)<=2; itr++)
    {
        for (auto itry=lower_bound(itr->second.begin(), itr->second.end(), make_pair(y[idx]/scaling-2, 0ll)); itry!=itr->second.end()&&abs(itry->first-y[idx]/scaling)<=2; itry++)
        {
            int idx2=itry->second;
            if (res[idx2]) continue;
            if ((x[idx]-x[idx2])*(x[idx]-x[idx2])+(y[idx]-y[idx2])*(y[idx]-y[idx2])<=(r[idx]+r[idx2])*(r[idx]+r[idx2]))
            {
                res[idx2]=idx;
                s.erase({r[idx2], -idx2});
            }
        }
    }
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n;
    for (int i=1; i<=n; i++) cin>>x[i]>>y[i]>>r[i], x[i]+=cns, y[i]+=cns, s.insert({r[i], -i});
    while (!s.empty()) solve();
    for (int i=1; i<=n; i++) cout<<res[i]<<' ';
}
#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...