답안 #560484

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
560484 2022-05-11T14:07:52 Z kartel 분수 공원 (IOI21_parks) C++17
45 / 100
2238 ms 165704 KB
#include <bits/stdc++.h>
//#include "grader.cpp"
#include "parks.h"
#define F first
#define S second
#define pb push_back
#define sz(x) (int)x.size()
#define el "\n"
#define all(x) (x).begin(), (x).end()

#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-O3")
#pragma GCC optimize("Ofast")

using namespace std;
typedef long long ll;

const int N = 5e5 + 500;

mt19937 rnd(time(0));

const int steps[4][2] = {{0, 2}, {2, 0}, {0, -2}, {-2, 0}};

int pr[N];
int cmp[2 * N], to[2 * N];
vector <int> g[2 * N], gr[2 * N], ord;
bool mk[2 * N];

int f(int v) {return (pr[v] == v ? v : pr[v] = f(pr[v]));}
void link(int v, int u) {
    v = f(v); u = f(u);
    if (v == u) {
        return;
    }
    pr[u] = v;
}

int nt(int x) {return (x < N ? x + N : x - N);}

void add_impl(int a, int b) {
    int na = nt(a), nb = nt(b);

    g[na].pb(b); gr[b].pb(na);
    g[nb].pb(a); gr[a].pb(nb);
}

void dfs(int v) {
    mk[v] = 1;
    for (auto u : g[v]) {
        if (mk[u]) {
            continue;
        }
        dfs(u);
    }
    ord.pb(v);
}

int construct_roads(vector <int> x, vector <int> y) {
    int n = sz(x);
    map <pair <int, int>, int> mp, used;
    vector <pair <int, int> > r;
    vector <int> pm(n);
    iota(all(pm), 0);
    shuffle(all(pm), rnd);

    bool sd = 1;
    for (int i = 0; i < n; i++) {
        mp[{x[i], y[i]}] = i;
        pr[i] = i;
        sd &= (x[i] >= 2 && x[i] <= 4);
    }

    for (auto i : pm) {
        for (int j = 0; j < 4; j++) {
            int cx = x[i] + steps[j][0];
            int cy = y[i] + steps[j][1];

            if (mp.count({cx, cy}) && !used[{i, mp[{cx, cy}]}] && f(i) != f(mp[{cx, cy}])) {
                int to = mp[{cx, cy}];
                link(i, to);
                r.pb({i, to});
                used[{to, i}] = 1;
                used[{i, to}] = 1;
            }
        }
    }
    sort(all(r));
    r.resize(unique(all(r)) - r.begin());

    for (int i = 0; i < n; i++) {
        if (f(i) != f(0)) {
            return 0;
        }
    }
    vector <int> u, v, A, B;
    map <pair <int, int>, vector <int> > e;

    for (int i = 0; i < sz(r); i++) {
        int a = r[i].F, b = r[i].S;
        u.pb(a); v.pb(b);
        if (abs(x[a] - x[b]) == 0) {
            int lx = x[a];
            int ly = min(y[a], y[b]);

            e[{lx - 1, ly + 1}].pb(i);
            e[{lx + 1, ly + 1}].pb(nt(i));
        } else {
            int lx = min(x[a], x[b]);
            int ly = y[a];

            e[{lx + 1, ly + 1}].pb(i);
            e[{lx + 1, ly - 1}].pb(nt(i));
        }
    }
    for (auto [p, v] : e) {
        int x = p.F, y = p.S;
        if (sz(v) == 1) {
            continue;
        }
        assert(sz(v) == 2);
        int a = v[0], b = v[1];

        add_impl(a, b);
    }

    for (int i = 0; i < 2 * N; i++) {
        cmp[i] = -1;
        if (mk[i]) {
            continue;
        }
        dfs(i);
    }
    reverse(all(ord));

    int C = 0;
    for (auto v : ord) {
        function <void(int)> dfsr = [&](int v) {
            if (cmp[v] != -1) {
                return;
            }
            cmp[v] = C;
            for (auto u : gr[v]) {
                dfsr(u);
            }
        };

        dfsr(v);
        C++;
    }

    for (int i = 0; i < N; i++) {
        if (cmp[i] == cmp[nt(i)]) {
            if (sd) {
                while(1);
            }
            return 0;
        }
        to[i] = (cmp[i] > cmp[nt(i)]);
    }

    for (int i = 0; i < sz(r); i++) {
        int a = r[i].F, b = r[i].S;
        if (abs(x[a] - x[b]) == 0) {
            int lx = x[a];
            int ly = min(y[a], y[b]);

            if (to[i]) {
                A.pb(lx + 1);
            } else {
                A.pb(lx - 1);
            }
            B.pb(ly + 1);
        } else {
            int lx = min(x[a], x[b]);
            int ly = y[a];

            if (to[i]) {
                B.pb(ly - 1);
            } else {
                B.pb(ly + 1);
            }
            A.pb(lx + 1);
        }
    }

    build(u, v, A, B);
    return 1;
}

Compilation message

parks.cpp: In function 'int construct_roads(std::vector<int>, std::vector<int>)':
parks.cpp:116:13: warning: unused variable 'x' [-Wunused-variable]
  116 |         int x = p.F, y = p.S;
      |             ^
parks.cpp:116:22: warning: unused variable 'y' [-Wunused-variable]
  116 |         int x = p.F, y = p.S;
      |                      ^
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 58168 KB Output is correct
2 Correct 39 ms 58168 KB Output is correct
3 Correct 23 ms 47236 KB Output is correct
4 Correct 41 ms 58212 KB Output is correct
5 Correct 40 ms 58168 KB Output is correct
6 Correct 23 ms 47284 KB Output is correct
7 Correct 23 ms 47276 KB Output is correct
8 Correct 23 ms 47296 KB Output is correct
9 Correct 630 ms 107144 KB Output is correct
10 Correct 72 ms 62972 KB Output is correct
11 Correct 259 ms 84404 KB Output is correct
12 Correct 91 ms 65488 KB Output is correct
13 Correct 142 ms 57036 KB Output is correct
14 Correct 25 ms 47444 KB Output is correct
15 Correct 27 ms 47700 KB Output is correct
16 Correct 642 ms 107400 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 58168 KB Output is correct
2 Correct 39 ms 58168 KB Output is correct
3 Correct 23 ms 47236 KB Output is correct
4 Correct 41 ms 58212 KB Output is correct
5 Correct 40 ms 58168 KB Output is correct
6 Correct 23 ms 47284 KB Output is correct
7 Correct 23 ms 47276 KB Output is correct
8 Correct 23 ms 47296 KB Output is correct
9 Correct 630 ms 107144 KB Output is correct
10 Correct 72 ms 62972 KB Output is correct
11 Correct 259 ms 84404 KB Output is correct
12 Correct 91 ms 65488 KB Output is correct
13 Correct 142 ms 57036 KB Output is correct
14 Correct 25 ms 47444 KB Output is correct
15 Correct 27 ms 47700 KB Output is correct
16 Correct 642 ms 107400 KB Output is correct
17 Runtime error 58 ms 95728 KB Execution killed with signal 6
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 58168 KB Output is correct
2 Correct 39 ms 58168 KB Output is correct
3 Correct 23 ms 47236 KB Output is correct
4 Correct 41 ms 58212 KB Output is correct
5 Correct 40 ms 58168 KB Output is correct
6 Correct 23 ms 47284 KB Output is correct
7 Correct 23 ms 47276 KB Output is correct
8 Correct 23 ms 47296 KB Output is correct
9 Correct 630 ms 107144 KB Output is correct
10 Correct 72 ms 62972 KB Output is correct
11 Correct 259 ms 84404 KB Output is correct
12 Correct 91 ms 65488 KB Output is correct
13 Correct 142 ms 57036 KB Output is correct
14 Correct 25 ms 47444 KB Output is correct
15 Correct 27 ms 47700 KB Output is correct
16 Correct 642 ms 107400 KB Output is correct
17 Runtime error 58 ms 95728 KB Execution killed with signal 6
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 58168 KB Output is correct
2 Correct 39 ms 58168 KB Output is correct
3 Correct 23 ms 47236 KB Output is correct
4 Correct 41 ms 58212 KB Output is correct
5 Correct 40 ms 58168 KB Output is correct
6 Correct 23 ms 47284 KB Output is correct
7 Correct 23 ms 47276 KB Output is correct
8 Correct 23 ms 47296 KB Output is correct
9 Correct 630 ms 107144 KB Output is correct
10 Correct 72 ms 62972 KB Output is correct
11 Correct 259 ms 84404 KB Output is correct
12 Correct 91 ms 65488 KB Output is correct
13 Correct 142 ms 57036 KB Output is correct
14 Correct 25 ms 47444 KB Output is correct
15 Correct 27 ms 47700 KB Output is correct
16 Correct 642 ms 107400 KB Output is correct
17 Correct 41 ms 58224 KB Output is correct
18 Correct 40 ms 58176 KB Output is correct
19 Correct 25 ms 47252 KB Output is correct
20 Correct 1654 ms 165704 KB Output is correct
21 Correct 1680 ms 162596 KB Output is correct
22 Correct 1765 ms 162180 KB Output is correct
23 Correct 1221 ms 142048 KB Output is correct
24 Correct 407 ms 64520 KB Output is correct
25 Correct 1252 ms 91324 KB Output is correct
26 Correct 1130 ms 91180 KB Output is correct
27 Correct 1557 ms 156224 KB Output is correct
28 Correct 1556 ms 156128 KB Output is correct
29 Correct 1683 ms 156120 KB Output is correct
30 Correct 1666 ms 156040 KB Output is correct
31 Correct 40 ms 58176 KB Output is correct
32 Correct 96 ms 65340 KB Output is correct
33 Correct 138 ms 55836 KB Output is correct
34 Correct 1618 ms 165152 KB Output is correct
35 Correct 50 ms 49464 KB Output is correct
36 Correct 235 ms 58224 KB Output is correct
37 Correct 495 ms 69212 KB Output is correct
38 Correct 577 ms 98704 KB Output is correct
39 Correct 865 ms 113744 KB Output is correct
40 Correct 1225 ms 128724 KB Output is correct
41 Correct 1678 ms 144412 KB Output is correct
42 Correct 2095 ms 159060 KB Output is correct
43 Correct 38 ms 58168 KB Output is correct
44 Correct 41 ms 58224 KB Output is correct
45 Correct 44 ms 58168 KB Output is correct
46 Correct 25 ms 47260 KB Output is correct
47 Correct 25 ms 47316 KB Output is correct
48 Correct 46 ms 58156 KB Output is correct
49 Correct 42 ms 58168 KB Output is correct
50 Correct 43 ms 58224 KB Output is correct
51 Correct 43 ms 58216 KB Output is correct
52 Correct 23 ms 47244 KB Output is correct
53 Correct 42 ms 58204 KB Output is correct
54 Correct 29 ms 47760 KB Output is correct
55 Correct 30 ms 47892 KB Output is correct
56 Correct 906 ms 108196 KB Output is correct
57 Correct 1333 ms 130500 KB Output is correct
58 Correct 1424 ms 130636 KB Output is correct
59 Correct 24 ms 47316 KB Output is correct
60 Correct 44 ms 58152 KB Output is correct
61 Correct 30 ms 47220 KB Output is correct
62 Correct 1740 ms 156132 KB Output is correct
63 Correct 1771 ms 156028 KB Output is correct
64 Correct 1697 ms 155624 KB Output is correct
65 Correct 37 ms 48160 KB Output is correct
66 Correct 44 ms 49020 KB Output is correct
67 Correct 958 ms 107848 KB Output is correct
68 Correct 1607 ms 133348 KB Output is correct
69 Correct 2231 ms 157972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 58168 KB Output is correct
2 Correct 39 ms 58168 KB Output is correct
3 Correct 23 ms 47236 KB Output is correct
4 Correct 41 ms 58212 KB Output is correct
5 Correct 40 ms 58168 KB Output is correct
6 Correct 23 ms 47284 KB Output is correct
7 Correct 23 ms 47276 KB Output is correct
8 Correct 23 ms 47296 KB Output is correct
9 Correct 630 ms 107144 KB Output is correct
10 Correct 72 ms 62972 KB Output is correct
11 Correct 259 ms 84404 KB Output is correct
12 Correct 91 ms 65488 KB Output is correct
13 Correct 142 ms 57036 KB Output is correct
14 Correct 25 ms 47444 KB Output is correct
15 Correct 27 ms 47700 KB Output is correct
16 Correct 642 ms 107400 KB Output is correct
17 Correct 1882 ms 156336 KB Output is correct
18 Correct 1876 ms 156784 KB Output is correct
19 Correct 1896 ms 163960 KB Output is correct
20 Correct 2183 ms 164948 KB Output is correct
21 Correct 1764 ms 147312 KB Output is correct
22 Correct 45 ms 58176 KB Output is correct
23 Correct 244 ms 74584 KB Output is correct
24 Correct 95 ms 52168 KB Output is correct
25 Correct 426 ms 64312 KB Output is correct
26 Correct 842 ms 76380 KB Output is correct
27 Correct 955 ms 110932 KB Output is correct
28 Correct 1295 ms 124524 KB Output is correct
29 Correct 1562 ms 137640 KB Output is correct
30 Correct 1936 ms 150692 KB Output is correct
31 Correct 2238 ms 164292 KB Output is correct
32 Correct 1873 ms 162336 KB Output is correct
33 Correct 1623 ms 156112 KB Output is correct
34 Correct 35 ms 48468 KB Output is correct
35 Correct 51 ms 49300 KB Output is correct
36 Correct 851 ms 109156 KB Output is correct
37 Correct 1462 ms 135520 KB Output is correct
38 Correct 2078 ms 160844 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 58168 KB Output is correct
2 Correct 39 ms 58168 KB Output is correct
3 Correct 23 ms 47236 KB Output is correct
4 Correct 41 ms 58212 KB Output is correct
5 Correct 40 ms 58168 KB Output is correct
6 Correct 23 ms 47284 KB Output is correct
7 Correct 23 ms 47276 KB Output is correct
8 Correct 23 ms 47296 KB Output is correct
9 Correct 630 ms 107144 KB Output is correct
10 Correct 72 ms 62972 KB Output is correct
11 Correct 259 ms 84404 KB Output is correct
12 Correct 91 ms 65488 KB Output is correct
13 Correct 142 ms 57036 KB Output is correct
14 Correct 25 ms 47444 KB Output is correct
15 Correct 27 ms 47700 KB Output is correct
16 Correct 642 ms 107400 KB Output is correct
17 Runtime error 58 ms 95728 KB Execution killed with signal 6
18 Halted 0 ms 0 KB -