Submission #393580

#TimeUsernameProblemLanguageResultExecution timeMemory
393580KoDCircle selection (APIO18_circle_selection)C++17
19 / 100
1252 ms53500 KiB
#include <bits/stdc++.h>

template <class T>
using Vec = std::vector<T>;

using ll = long long;

constexpr ll sq(const ll x) {
    return x * x;
}

int main() {
    int N;
    std::cin >> N;
    Vec<ll> X(N), Y(N), R(N);
    for (int i = 0; i < N; ++i) {
        std::cin >> X[i] >> Y[i] >> R[i];
    }
    Vec<int> order(N);
    std::iota(order.begin(), order.end(), 0);
    std::stable_sort(order.begin(), order.end(), [&](const int i, const int j) {
        return R[i] > R[j];
    });
    Vec<int> ans(N, -1);
    if (N <= 5000) {
        for (const auto x: order) {
            if (ans[x] == -1) {
                ans[x] = x;
                for (int i = 0; i < N; ++i) {
                    if (ans[i] == -1 and sq(X[i] - X[x]) + sq(Y[i] - Y[x]) <= sq(R[i] + R[x])) {
                        ans[i] = x;
                    }
                }
            }    
        }
    }
    else {
        std::set<std::pair<ll, int>> set;
        for (int i = 0; i < N; ++i) {
            set.emplace(X[i] - R[i], i);
            set.emplace(X[i] + R[i], i);
        }
        for (const auto x: order) {
            if (ans[x] == -1) {
                ans[x] = x;
                while (true) {
                    auto itr = set.lower_bound(std::make_pair(X[x] - R[x], 0));
                    if (itr == set.end() or itr -> first > X[x] + R[x]) {
                        break;
                    }
                    const auto i = itr -> second;
                    ans[i] = x;
                    set.erase(std::make_pair(X[i] - R[i], i));
                    set.erase(std::make_pair(X[i] + R[i], i));
                }
            }
        }
    }
    for (int i = 0; i < N; ++i) {
        std::cout << ans[i] + 1 << " \n"[i + 1 == N];
    }
}
#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...