제출 #1155152

#제출 시각아이디문제언어결과실행 시간메모리
1155152fve5원 고르기 (APIO18_circle_selection)C++20
7 / 100
3087 ms346532 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long i64;

struct circle {
    int idx;
    i64 x, y, r;
};

bool operator<(const circle &u, const circle &v) { return make_pair(-u.r, u.idx) < make_pair(-v.r, v.idx); }
bool sect(const circle &u, const circle &v) { return (u.x - v.x) * (u.x - v.x) + (u.y - v.y) * (u.y - v.y) <= (u.r + v.r) * (u.r + v.r); }

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int N; cin >> N;

    multiset<circle> circles;
    for (int i = 0; i < N; i++) {
        int x, y, r; cin >> x >> y >> r,
        circles.insert(circle{i, x, y, r});
    }

    vector<int> answer(N);

    int step = 1 << 30;
    map<pair<int, int>, vector<multiset<circle>::iterator>> grid;

    auto rebuild = [&]() {
        grid.clear();
        for (auto it = circles.begin(); it != circles.end(); it++)
            grid[{it->x / step, it->y / step}].push_back(it);
    };

    while (!circles.empty()) {
        circle eliminator = *circles.begin();
        answer[eliminator.idx] = eliminator.idx;
        if (eliminator.r < step) {
            step /= 2;
            rebuild();
        }

        for (int gx = eliminator.x / step - 3; gx <= eliminator.x / step + 3; gx++) {
            for (int gy = eliminator.y / step - 3; gy <= eliminator.y / step + 3; gy++) {
                auto& grid_elems = grid[{gx, gy}];
                for (int i = 0; i < grid_elems.size(); i++) {
                    if (sect(*grid_elems[i], eliminator)) {
                        answer[grid_elems[i]->idx] = eliminator.idx;
                        circles.erase(grid_elems[i]);
                        swap(grid_elems[i], grid_elems.back());
                        grid_elems.pop_back();
                        i--;
                    }
                }
            }
        }
    }

    for (auto x: answer)
        cout << x + 1 << ' ';
    cout << '\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...