Submission #579111

#TimeUsernameProblemLanguageResultExecution timeMemory
579111noedit원 고르기 (APIO18_circle_selection)C++17
72 / 100
3080 ms248484 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAX 301010
#define INF 1000000010
pair<pair<int, int>, pair<int, int>> in[MAX];
int X[MAX];
int Y[MAX];
int R[MAX];
int ind[MAX];
int ri[MAX];
int ans[MAX];
inline ll sq(ll x)
{
    return x * x;
}
inline bool check(int i, int j)
{
    return sq(X[i] - X[j]) + sq(Y[i] - Y[j]) <= sq(R[i] + R[j]);
}
bool isrange(int x, int y)
{
    if (x < 0 || y < 0)
    {
        return false;
    }
    return true;
}
inline ll trans(int x, int y)
{
    return ((ll)x * (ll)INF) + y;
}
bool cmp(pair<pair<int, int>, pair<int, int>>& p1, pair<pair<int, int>, pair<int, int>>& p2)
{
    if (p1.first.first == p2.first.first)
    {
        return p1.first.second < p2.first.second;
    }
    else
    {
        return p1.first.first > p2.first.first;
    }
}

unordered_map<ll, vector<int>> mp;

signed main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    int n;
    cin >> n;
    int i;
    for (i = 1; i <= n; i++)
    {
        cin >> in[i].second.first >> in[i].second.second >> in[i].first.first, in[i].first.second = i;
    }
    sort(in + 1, in + n + 1, cmp);
    for (i = 1; i <= n; i++)
    {
        tie(X[i], Y[i], R[i], ind[i]) = make_tuple(in[i].second.first + INF, in[i].second.second + INF, in[i].first.first, in[i].first.second);
    }
    int k;
    int s, e;
    e = 0;
    for (k = 30; k >= 0; k--)
    {
        int r = 1 << k;
        s = e + 1;
        if (R[s] < r / 2)
        {
            continue;
        }
        mp.clear();
        e = 0;
        for (i = s; i <= n; i++)
        {
            if (ans[i])
            {
                continue;
            }
            int x = X[i] >> k;
            int y = Y[i] >> k;
            if (R[i] < r / 2 && !e)
            {
                e = i - 1;
            }
            int xx, yy;
            for (xx = x - 1; xx <= x + 1; xx++)
            {
                for (yy = y - 1; yy <= y + 1; yy++)
                {
                    mp[((ll)xx << 31LL) + yy].push_back(i);
                }
            }
        }
        if (e == 0)
        {
            e = n;
        }
        for (i = s; i <= e; i++)
        {
            if (ans[i])
            {
                continue;
            }
            ans[i] = i;
            int x, y;
            x = X[i] >> k;
            y = Y[i] >> k;
            int xx, yy;
            for (xx = x - 1; xx <= x + 1; xx++)
            {
                for (yy = y - 1; yy <= y + 1; yy++)
                {
                    ll t = ((ll)xx << 31LL) + yy;
                    for (auto c : mp[t])
                    {
                        if (!ans[c] && check(c, i))
                        {
                            ans[c] = i;
                        }
                    }
                }
            }
        }
    }
    for (i = 1; i <= n; i++)
    {
        ri[ind[i]] = i;
    }
    for (i = 1; i <= n; i++)
    {
        cout << ind[ans[ri[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...