Submission #107874

#TimeUsernameProblemLanguageResultExecution timeMemory
107874kuroniCircle selection (APIO18_circle_selection)C++17
100 / 100
2241 ms43728 KiB
#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

const int N = 300005, MX = 1E9, INF = 2E9 + 7;

int n, cur = INF, ans[N], ind[N];
unordered_map<long long, vector<int>> gri;

long long sqr(long long u)
{
    return u * u;
}

struct SCircle
{
    int x, y, r;

    bool intersect(SCircle oth)
    {
        return sqr(oth.x - x) + sqr(oth.y - y) <= sqr(oth.r + r);
    }
} a[N];

void make_grid(int sz)
{
    gri.clear();
    for (int i = 1; i <= n; i++)
        if (ans[i] == 0)
        {
            int cx = a[i].x / sz, cy = a[i].y / sz;
            long long pos = 1LL * cx * INF + cy;
            gri[pos].push_back(i);
        }
}

void solve(long long pos, int u)
{
    if (gri.count(pos) == 0)
        return;
    vector<int> &cur = gri[pos];
    for (int i = 0; i < cur.size(); i++)
        if (a[cur[i]].intersect(a[u]))
        {
            ans[cur[i]] = u;
            swap(cur[i--], cur.back());
            cur.pop_back();
        }
    if (cur.empty())
        gri.erase(pos);
}

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].r);
        a[i].x += MX; a[i].y += MX;
        ind[i] = i;
    }
    sort(ind + 1, ind + n + 1, [](const int &x, const int &y) {
        return a[x].r > a[y].r || (a[x].r == a[y].r && x < y);
    });
    for (int i = 1; i <= n; i++)
    {
        int u = ind[i];
        if (ans[u] == 0)
        {
            if (a[u].r <= cur / 2)
            {
                cur = a[u].r;
                make_grid(cur);
            }
            for (int cx = a[u].x / cur - 2; cx <= a[u].x / cur + 2; cx++)
                for (int cy = a[u].y / cur - 2; cy <= a[u].y / cur + 2; cy++)
                    solve(1LL * cx * INF + cy, u);
        }
    }
    for (int i = 1; i <= n; i++)
        printf("%d ", ans[i]);
}

Compilation message (stderr)

circle_selection.cpp: In function 'void solve(long long int, int)':
circle_selection.cpp:45:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < cur.size(); i++)
                     ~~^~~~~~~~~~~~
circle_selection.cpp: In function 'int main()':
circle_selection.cpp:58:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
circle_selection.cpp:61:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].r);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...