답안 #430572

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
430572 2021-06-16T16:11:00 Z Yarie 원 고르기 (APIO18_circle_selection) C++14
42 / 100
2839 ms 128712 KB
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#define x first
#define y second
#define all(v) v.begin(), v.end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<ll, ll> pii;
typedef vector<pii> vii;
typedef vector<bool> vb;

struct Circle{
    ll x, y, r;
    int ind;
};
bool operator<(Circle c1, Circle c2) {
    return c1.ind < c2.ind;
}

ll Dist(Circle c1, Circle c2) {
    return (c1.x - c2.x) * (c1.x - c2.x) + (c1.y - c2.y) * (c1.y - c2.y);
}

bool inters(Circle c1, Circle c2) {
    return Dist(c1, c2) <= (c1.r + c2.r) * (c1.r + c2.r);
}

int main() {
    int n;
    cin >> n;
    vector<Circle> circles(n);
    set<pii> ranges;
    vector<pair<pii, int>> sweep;
    bool subtask2 = true;
    bool subtask4 = true;
    map<pii, set<Circle>> grid;
    ll r = 0;
    for (int i = 0; i < n; i++) {
        cin >> circles[i].x >> circles[i].y >> circles[i].r;
        circles[i].ind = i + 1;
        if (r && r != circles[i].r) {
            subtask4 = false;
        }
        r = circles[i].r;
        grid[{circles[i].x / r, circles[i].y / r}].insert(circles[i]);
        if (circles[i].y) subtask2 = false;
        sweep.push_back({{circles[i].x, circles[i].y - circles[i].r}, i});
        sweep.push_back({{circles[i].x, circles[i].y + circles[i].r}, i});
        ranges.insert({circles[i].x - circles[i].r, i + 1});
        ranges.insert({circles[i].x + circles[i].r, i + 1});
    }
    sort(all(circles), [] (Circle c1, Circle c2) {
        if (c1.r == c2.r) return c1.ind < c2.ind;
        return c1.r > c2.r;
    });
    vi ans(n + 1);
    if (subtask4) {
        for (auto c : circles) {
            if (ans[c.ind]) continue;
            int x = c.x / r - 2;
            int y = c.y / r - 2;
            for (int i = x; i < x + 5; i++) {
                for (int j = y; j < y + 5; j++) {
                    auto it1 = grid.find({i, j});
                    if (it1 == grid.end()) continue;
                    for (auto it = it1->y.begin(); it != it1->y.end();) {
                        if (inters(c, *it)) {
                            ans[it->ind] = c.ind;
                            it = it1->y.erase(it);
                        } else {
                            it++;
                        }
                    }
                }
            }
        }
    }
    if (n <= 5000) {
        sort(all(circles), [] (Circle c1, Circle c2) {
            if (c1.r == c2.r) return c1.ind < c2.ind;
            return c1.r > c2.r;
        });
        for (int i = 0; i < n; i++) {
            Circle c = circles[i];
            if (ans[c.ind]) continue;
            ans[c.ind] = c.ind;
            for (int j = i + 1; j < n; j++) {
                if (!ans[circles[j].ind] && inters(circles[j], c)) {
                    ans[circles[j].ind] = c.ind;
                }
            }
        }
        for (int i = 1; i <= n; i++) cout << (ans[i] ? ans[i] : i) << " ";
        return 0;
    }
    if (subtask2) {
        sort(all(circles), [] (Circle c1, Circle c2) {
            if (c1.r == c2.r) return c1.ind < c2.ind;
            return c1.r > c2.r;
        });
        for (auto c : circles) {
            if (ans[c.ind]) continue;
            ans[c.ind] = c.ind;
            for (auto it = ranges.lower_bound({c.x - c.r, 0}); it != ranges.end() && it->x <= c.x + c.r; it = ranges.erase(it)) {
                if (!ans[it->y]) {
                    ans[it->y] = c.ind;
                }
            }
        }
        for (int i = 1; i <= n; i++) cout << (ans[i] ? ans[i] : i) << " ";
        return 0;
    }
    sort(all(sweep), [&] (pair<pii, int> p1, pair<pii, int> p2) {
        if (p1.x.y == p2.x.y) {
            bool a, b;
            a = p1.x.y < circles[p1.y].y;
            b = p2.x.y < circles[p2.y].y;
            return a > b;
        }
        return p1.x.y < p2.x.y;
    });
    set<pii> inside;
    for (auto p : sweep) {
        if (ans[p.y + 1]) continue;
        auto it = inside.insert({p.x.x, p.y});
        auto before = it.x, after = it.x;
        if (before != inside.begin()) {
            before--;
            if (inters(circles[before->y], circles[p.y])) {
                if (circles[before->y].r > circles[p.y].r || (circles[before->y].r == circles[p.y].r && before->y < p.y)) {
                    ans[before->y + 1] = ans[p.y + 1] = before->y + 1;
                } else {
                    ans[before->y + 1] = ans[p.y + 1] = p.y + 1;
                }
                inside.erase(it.x), inside.erase(before);
                continue;
            }
        }
        after++;
        if (after != inside.end()) {
            if (inters(circles[after->y], circles[p.y])) {
                if (circles[after->y].r > circles[p.y].r || (circles[after->y].r == circles[p.y].r && after->y < p.y)) {
                    ans[after->y + 1] = ans[p.y + 1] = after->y + 1;
                } else {
                    ans[after->y + 1] = ans[p.y + 1] = p.y + 1;
                }
                inside.erase(it.x), inside.erase(after);
                continue;
            }
        }
        if (!it.y) {
            inside.erase(it.x);
        }
    }
    for (int i = 1; i <= n; i++) cout << (ans[i] ? ans[i] : i) << " ";
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 204 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 1 ms 332 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 332 KB Output is correct
10 Correct 1 ms 332 KB Output is correct
11 Correct 1 ms 332 KB Output is correct
12 Correct 1 ms 332 KB Output is correct
13 Correct 1 ms 292 KB Output is correct
14 Correct 1 ms 332 KB Output is correct
15 Correct 1 ms 332 KB Output is correct
16 Correct 3 ms 588 KB Output is correct
17 Correct 3 ms 588 KB Output is correct
18 Correct 3 ms 588 KB Output is correct
19 Correct 14 ms 1832 KB Output is correct
20 Correct 14 ms 1800 KB Output is correct
21 Correct 15 ms 1936 KB Output is correct
22 Correct 47 ms 2416 KB Output is correct
23 Correct 44 ms 2312 KB Output is correct
24 Correct 46 ms 2388 KB Output is correct
25 Correct 45 ms 2312 KB Output is correct
26 Correct 45 ms 2416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1589 ms 95016 KB Output is correct
2 Correct 1605 ms 94876 KB Output is correct
3 Correct 1642 ms 94652 KB Output is correct
4 Correct 1531 ms 95012 KB Output is correct
5 Correct 1769 ms 119596 KB Output is correct
6 Correct 1666 ms 125284 KB Output is correct
7 Correct 1697 ms 124640 KB Output is correct
8 Correct 1678 ms 124924 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 504 ms 43152 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2839 ms 128712 KB Output is correct
2 Correct 2081 ms 128080 KB Output is correct
3 Correct 1980 ms 105612 KB Output is correct
4 Correct 2217 ms 128312 KB Output is correct
5 Correct 2179 ms 128484 KB Output is correct
6 Correct 1896 ms 97664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 204 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 1 ms 332 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 332 KB Output is correct
10 Correct 1 ms 332 KB Output is correct
11 Correct 1 ms 332 KB Output is correct
12 Correct 1 ms 332 KB Output is correct
13 Correct 1 ms 292 KB Output is correct
14 Correct 1 ms 332 KB Output is correct
15 Correct 1 ms 332 KB Output is correct
16 Correct 3 ms 588 KB Output is correct
17 Correct 3 ms 588 KB Output is correct
18 Correct 3 ms 588 KB Output is correct
19 Correct 14 ms 1832 KB Output is correct
20 Correct 14 ms 1800 KB Output is correct
21 Correct 15 ms 1936 KB Output is correct
22 Correct 47 ms 2416 KB Output is correct
23 Correct 44 ms 2312 KB Output is correct
24 Correct 46 ms 2388 KB Output is correct
25 Correct 45 ms 2312 KB Output is correct
26 Correct 45 ms 2416 KB Output is correct
27 Incorrect 31 ms 3588 KB Output isn't correct
28 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 1 ms 204 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 1 ms 332 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 332 KB Output is correct
10 Correct 1 ms 332 KB Output is correct
11 Correct 1 ms 332 KB Output is correct
12 Correct 1 ms 332 KB Output is correct
13 Correct 1 ms 292 KB Output is correct
14 Correct 1 ms 332 KB Output is correct
15 Correct 1 ms 332 KB Output is correct
16 Correct 3 ms 588 KB Output is correct
17 Correct 3 ms 588 KB Output is correct
18 Correct 3 ms 588 KB Output is correct
19 Correct 14 ms 1832 KB Output is correct
20 Correct 14 ms 1800 KB Output is correct
21 Correct 15 ms 1936 KB Output is correct
22 Correct 47 ms 2416 KB Output is correct
23 Correct 44 ms 2312 KB Output is correct
24 Correct 46 ms 2388 KB Output is correct
25 Correct 45 ms 2312 KB Output is correct
26 Correct 45 ms 2416 KB Output is correct
27 Correct 1589 ms 95016 KB Output is correct
28 Correct 1605 ms 94876 KB Output is correct
29 Correct 1642 ms 94652 KB Output is correct
30 Correct 1531 ms 95012 KB Output is correct
31 Correct 1769 ms 119596 KB Output is correct
32 Correct 1666 ms 125284 KB Output is correct
33 Correct 1697 ms 124640 KB Output is correct
34 Correct 1678 ms 124924 KB Output is correct
35 Correct 1 ms 204 KB Output is correct
36 Incorrect 504 ms 43152 KB Output isn't correct
37 Halted 0 ms 0 KB -