Submission #932666

# Submission time Handle Problem Language Result Execution time Memory
932666 2024-02-24T02:30:03 Z Programmer123 Fountain Parks (IOI21_parks) C++17
55 / 100
3089 ms 85200 KB
#include <bits/stdc++.h>
#include "parks.h"

std::unordered_map<int, int> map[200001];
int N;
std::vector<std::pair<int, int>> vld[200000];
std::pair<int, int> assigned[200000];
std::set<std::pair<int, int>> taken;
time_t stop;
std::default_random_engine Rand(std::random_device{}());

bool shuffle = false;

bool backtrack(int n) {
    if (n == N - 1) return true;
    if (clock() > stop) return false;
    if (shuffle && vld[n].size() == 2 && Rand() % 2) {
        std::swap(vld[n][0], vld[n][1]);
    }
    for (auto a: vld[n]) {
        if (taken.count(a)) continue;
        taken.insert(a);
        if (backtrack(n + 1)) {
            assigned[n] = a;
            return true;
        }
        taken.erase(a);
    }
    return false;
}

int construct_roads(std::vector<int> x, std::vector<int> y) {
    stop = clock() + 3 * CLOCKS_PER_SEC;
    N = (int) x.size();
    if (N == 1) {
        build({}, {}, {}, {});
        return 1;
    }
    int maxx = x[0];
    int minx = x[0];
    int maxy = y[0];
    int miny = y[0];
    for (int i = 0; i < N; ++i) {
        maxx = std::max(maxx, x[i]);
        minx = std::min(minx, x[i]);
        maxy = std::max(maxy, y[i]);
        miny = std::min(miny, y[i]);
    }
    for (int i = 0; i < N; ++i) {
        map[x[i]][y[i]] = i;
    }
    while (true) {
        std::vector<int> u, v, a, b;
        bool seen[N];
        for (int i = 0; i < N; ++i) {
            seen[i] = false;
        }
        std::queue<int> bfs;
        int start = 0;
        if (shuffle) start = Rand() % N;
        bfs.push(start);
        seen[start] = true;
        auto add = [&](int x, int y, std::vector<int> &data) {
            if (x < 0 || x > 200000) return;
            if (map[x].count(y)) data.push_back(map[x][y]);
        };
        auto edges = [&](int x, int y) {
            std::vector<int> result;
            add(x, y + 2, result);
            add(x, y - 2, result);
            add(x + 2, y, result);
            add(x - 2, y, result);
            if (shuffle) {
                std::shuffle(result.begin(), result.end(), Rand);
            }
            return result;
        };
        int rem = N - 1;
        while (!bfs.empty()) {
            auto next = bfs.front();
            bfs.pop();
            for (auto n: edges(x[next], y[next])) {
                if (!seen[n]) {
                    seen[n] = true;
                    bfs.push(n);
                    rem--;
                    u.push_back(next);
                    v.push_back(n);
                }
            }
        }
        if (rem)
            return 0;

        std::function<std::vector<std::pair<int, int>>(int, int)> valid = [&x, &y, minx, maxx, miny, maxy](int u,
                                                                                                           int v) -> std::vector<std::pair<int, int>> {
            if (x[u] == x[v]) {
                int _y = (y[u] + y[v]) / 2;
                if (x[u] == minx) return {{minx - 1, _y}};
                if (x[u] == maxx) return {{maxx + 1, _y}};
                return {{x[u] + 1, _y},
                        {x[u] - 1, _y}};
            } else {
                int _x = (x[u] + x[v]) / 2;
                if (y[u] == miny) return {{_x, miny - 1}};
                if (y[u] == maxy) return {{_x, maxy + 1}};
                return {{_x, y[u] + 1},
                        {_x, y[u] - 1}};
            }
        };
        if (shuffle) {
            std::vector<std::pair<int, int>> Edges;
            for (int i = 0; i < N - 1; ++i) {
                Edges.emplace_back(u[i], v[i]);
            }
            std::sort(Edges.begin(), Edges.end(), [&](std::pair<int, int> a, std::pair<int, int> b) {
                int A = a.first;
                int B = b.first;
                if (x[A] == x[B]) return y[A] < y[B];
                return x[A] < x[B];
            });
            for (int i = 0; i < N - 1; ++i) {
                u[i] = Edges[i].first;
                v[i] = Edges[i].second;
            }
        }
        for (int i = 0; i < N - 1; ++i) {
            vld[i] = valid(u[i], v[i]);
            if (shuffle && vld[i].size() == 2 && Rand() % 2) {
                std::swap(vld[i][0], vld[i][1]);
            }
        }
        if (backtrack(0)) {
            for (int i = 0; i < N - 1; ++i) {
                a.push_back(assigned[i].first);
                b.push_back(assigned[i].second);
            }
            build(u, v, a, b);
            return 1;
        }
        if (clock() > stop) break;
        shuffle = true;
#ifdef LOCAL
        printf("Retrying...\n");
#endif
    }
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 4 ms 17500 KB Output is correct
2 Correct 4 ms 17500 KB Output is correct
3 Correct 4 ms 17496 KB Output is correct
4 Correct 4 ms 17500 KB Output is correct
5 Correct 4 ms 17500 KB Output is correct
6 Correct 4 ms 17500 KB Output is correct
7 Correct 5 ms 17500 KB Output is correct
8 Correct 4 ms 17500 KB Output is correct
9 Correct 131 ms 49128 KB Output is correct
10 Correct 15 ms 20568 KB Output is correct
11 Correct 69 ms 34244 KB Output is correct
12 Correct 21 ms 22104 KB Output is correct
13 Correct 15 ms 20584 KB Output is correct
14 Correct 4 ms 17500 KB Output is correct
15 Correct 5 ms 17500 KB Output is correct
16 Correct 128 ms 49096 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 17500 KB Output is correct
2 Correct 4 ms 17500 KB Output is correct
3 Correct 4 ms 17496 KB Output is correct
4 Correct 4 ms 17500 KB Output is correct
5 Correct 4 ms 17500 KB Output is correct
6 Correct 4 ms 17500 KB Output is correct
7 Correct 5 ms 17500 KB Output is correct
8 Correct 4 ms 17500 KB Output is correct
9 Correct 131 ms 49128 KB Output is correct
10 Correct 15 ms 20568 KB Output is correct
11 Correct 69 ms 34244 KB Output is correct
12 Correct 21 ms 22104 KB Output is correct
13 Correct 15 ms 20584 KB Output is correct
14 Correct 4 ms 17500 KB Output is correct
15 Correct 5 ms 17500 KB Output is correct
16 Correct 128 ms 49096 KB Output is correct
17 Correct 4 ms 17752 KB Output is correct
18 Correct 4 ms 17500 KB Output is correct
19 Correct 4 ms 17324 KB Output is correct
20 Correct 4 ms 17500 KB Output is correct
21 Correct 4 ms 17500 KB Output is correct
22 Correct 4 ms 17500 KB Output is correct
23 Correct 283 ms 76856 KB Output is correct
24 Correct 4 ms 17500 KB Output is correct
25 Correct 6 ms 18144 KB Output is correct
26 Correct 5 ms 17500 KB Output is correct
27 Correct 5 ms 17500 KB Output is correct
28 Correct 106 ms 41044 KB Output is correct
29 Correct 162 ms 52852 KB Output is correct
30 Correct 218 ms 64508 KB Output is correct
31 Correct 290 ms 76944 KB Output is correct
32 Correct 4 ms 17496 KB Output is correct
33 Correct 4 ms 17500 KB Output is correct
34 Correct 5 ms 17340 KB Output is correct
35 Correct 4 ms 17496 KB Output is correct
36 Correct 4 ms 17500 KB Output is correct
37 Correct 4 ms 17500 KB Output is correct
38 Correct 4 ms 17496 KB Output is correct
39 Correct 4 ms 17500 KB Output is correct
40 Correct 4 ms 17496 KB Output is correct
41 Correct 4 ms 17500 KB Output is correct
42 Correct 4 ms 17500 KB Output is correct
43 Correct 5 ms 17500 KB Output is correct
44 Correct 5 ms 17596 KB Output is correct
45 Correct 132 ms 47464 KB Output is correct
46 Correct 205 ms 59976 KB Output is correct
47 Correct 197 ms 60060 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 17500 KB Output is correct
2 Correct 4 ms 17500 KB Output is correct
3 Correct 4 ms 17496 KB Output is correct
4 Correct 4 ms 17500 KB Output is correct
5 Correct 4 ms 17500 KB Output is correct
6 Correct 4 ms 17500 KB Output is correct
7 Correct 5 ms 17500 KB Output is correct
8 Correct 4 ms 17500 KB Output is correct
9 Correct 131 ms 49128 KB Output is correct
10 Correct 15 ms 20568 KB Output is correct
11 Correct 69 ms 34244 KB Output is correct
12 Correct 21 ms 22104 KB Output is correct
13 Correct 15 ms 20584 KB Output is correct
14 Correct 4 ms 17500 KB Output is correct
15 Correct 5 ms 17500 KB Output is correct
16 Correct 128 ms 49096 KB Output is correct
17 Correct 4 ms 17752 KB Output is correct
18 Correct 4 ms 17500 KB Output is correct
19 Correct 4 ms 17324 KB Output is correct
20 Correct 4 ms 17500 KB Output is correct
21 Correct 4 ms 17500 KB Output is correct
22 Correct 4 ms 17500 KB Output is correct
23 Correct 283 ms 76856 KB Output is correct
24 Correct 4 ms 17500 KB Output is correct
25 Correct 6 ms 18144 KB Output is correct
26 Correct 5 ms 17500 KB Output is correct
27 Correct 5 ms 17500 KB Output is correct
28 Correct 106 ms 41044 KB Output is correct
29 Correct 162 ms 52852 KB Output is correct
30 Correct 218 ms 64508 KB Output is correct
31 Correct 290 ms 76944 KB Output is correct
32 Correct 4 ms 17496 KB Output is correct
33 Correct 4 ms 17500 KB Output is correct
34 Correct 5 ms 17340 KB Output is correct
35 Correct 4 ms 17496 KB Output is correct
36 Correct 4 ms 17500 KB Output is correct
37 Correct 4 ms 17500 KB Output is correct
38 Correct 4 ms 17496 KB Output is correct
39 Correct 4 ms 17500 KB Output is correct
40 Correct 4 ms 17496 KB Output is correct
41 Correct 4 ms 17500 KB Output is correct
42 Correct 4 ms 17500 KB Output is correct
43 Correct 5 ms 17500 KB Output is correct
44 Correct 5 ms 17596 KB Output is correct
45 Correct 132 ms 47464 KB Output is correct
46 Correct 205 ms 59976 KB Output is correct
47 Correct 197 ms 60060 KB Output is correct
48 Correct 4 ms 17500 KB Output is correct
49 Correct 4 ms 17500 KB Output is correct
50 Correct 4 ms 17500 KB Output is correct
51 Correct 4 ms 17500 KB Output is correct
52 Correct 4 ms 17500 KB Output is correct
53 Correct 4 ms 17340 KB Output is correct
54 Correct 4 ms 17500 KB Output is correct
55 Correct 281 ms 76200 KB Output is correct
56 Correct 4 ms 17496 KB Output is correct
57 Correct 2886 ms 18032 KB Output is correct
58 Correct 12 ms 19288 KB Output is correct
59 Correct 10 ms 18012 KB Output is correct
60 Correct 133 ms 47016 KB Output is correct
61 Correct 259 ms 59692 KB Output is correct
62 Correct 235 ms 66468 KB Output is correct
63 Incorrect 3089 ms 68428 KB Solution announced impossible, but it is possible.
64 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 4 ms 17500 KB Output is correct
2 Correct 4 ms 17500 KB Output is correct
3 Correct 4 ms 17496 KB Output is correct
4 Correct 4 ms 17500 KB Output is correct
5 Correct 4 ms 17500 KB Output is correct
6 Correct 4 ms 17500 KB Output is correct
7 Correct 5 ms 17500 KB Output is correct
8 Correct 4 ms 17500 KB Output is correct
9 Correct 131 ms 49128 KB Output is correct
10 Correct 15 ms 20568 KB Output is correct
11 Correct 69 ms 34244 KB Output is correct
12 Correct 21 ms 22104 KB Output is correct
13 Correct 15 ms 20584 KB Output is correct
14 Correct 4 ms 17500 KB Output is correct
15 Correct 5 ms 17500 KB Output is correct
16 Correct 128 ms 49096 KB Output is correct
17 Correct 4 ms 17500 KB Output is correct
18 Correct 4 ms 17500 KB Output is correct
19 Correct 4 ms 17500 KB Output is correct
20 Correct 336 ms 85200 KB Output is correct
21 Correct 360 ms 79688 KB Output is correct
22 Correct 351 ms 79784 KB Output is correct
23 Correct 301 ms 71832 KB Output is correct
24 Correct 60 ms 28672 KB Output is correct
25 Correct 58 ms 28604 KB Output is correct
26 Correct 59 ms 28752 KB Output is correct
27 Correct 341 ms 76048 KB Output is correct
28 Correct 314 ms 76056 KB Output is correct
29 Correct 338 ms 76508 KB Output is correct
30 Correct 341 ms 76316 KB Output is correct
31 Correct 4 ms 17496 KB Output is correct
32 Correct 23 ms 22108 KB Output is correct
33 Correct 50 ms 33116 KB Output is correct
34 Correct 337 ms 85144 KB Output is correct
35 Correct 7 ms 18008 KB Output is correct
36 Correct 19 ms 20568 KB Output is correct
37 Correct 33 ms 23672 KB Output is correct
38 Correct 135 ms 41204 KB Output is correct
39 Correct 193 ms 50080 KB Output is correct
40 Correct 245 ms 58984 KB Output is correct
41 Correct 308 ms 67816 KB Output is correct
42 Correct 370 ms 76780 KB Output is correct
43 Correct 4 ms 17496 KB Output is correct
44 Correct 4 ms 17500 KB Output is correct
45 Correct 4 ms 17500 KB Output is correct
46 Correct 4 ms 17316 KB Output is correct
47 Correct 4 ms 17500 KB Output is correct
48 Correct 4 ms 17500 KB Output is correct
49 Correct 4 ms 17500 KB Output is correct
50 Correct 4 ms 17500 KB Output is correct
51 Correct 4 ms 17752 KB Output is correct
52 Correct 4 ms 17496 KB Output is correct
53 Correct 4 ms 17496 KB Output is correct
54 Correct 5 ms 17500 KB Output is correct
55 Correct 5 ms 17532 KB Output is correct
56 Correct 133 ms 47404 KB Output is correct
57 Correct 193 ms 60124 KB Output is correct
58 Correct 192 ms 60056 KB Output is correct
59 Correct 4 ms 17496 KB Output is correct
60 Correct 4 ms 17500 KB Output is correct
61 Correct 4 ms 17500 KB Output is correct
62 Correct 268 ms 76924 KB Output is correct
63 Correct 276 ms 76964 KB Output is correct
64 Correct 279 ms 76692 KB Output is correct
65 Correct 5 ms 17752 KB Output is correct
66 Correct 6 ms 18008 KB Output is correct
67 Correct 139 ms 47032 KB Output is correct
68 Correct 224 ms 62064 KB Output is correct
69 Correct 296 ms 76232 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 17500 KB Output is correct
2 Correct 4 ms 17500 KB Output is correct
3 Correct 4 ms 17496 KB Output is correct
4 Correct 4 ms 17500 KB Output is correct
5 Correct 4 ms 17500 KB Output is correct
6 Correct 4 ms 17500 KB Output is correct
7 Correct 5 ms 17500 KB Output is correct
8 Correct 4 ms 17500 KB Output is correct
9 Correct 131 ms 49128 KB Output is correct
10 Correct 15 ms 20568 KB Output is correct
11 Correct 69 ms 34244 KB Output is correct
12 Correct 21 ms 22104 KB Output is correct
13 Correct 15 ms 20584 KB Output is correct
14 Correct 4 ms 17500 KB Output is correct
15 Correct 5 ms 17500 KB Output is correct
16 Correct 128 ms 49096 KB Output is correct
17 Correct 320 ms 81052 KB Output is correct
18 Correct 337 ms 81096 KB Output is correct
19 Correct 344 ms 79856 KB Output is correct
20 Correct 335 ms 74816 KB Output is correct
21 Correct 299 ms 69656 KB Output is correct
22 Correct 4 ms 17500 KB Output is correct
23 Correct 50 ms 27092 KB Output is correct
24 Correct 10 ms 18780 KB Output is correct
25 Correct 24 ms 21788 KB Output is correct
26 Correct 39 ms 24712 KB Output is correct
27 Correct 165 ms 47300 KB Output is correct
28 Correct 218 ms 55020 KB Output is correct
29 Correct 268 ms 61932 KB Output is correct
30 Correct 317 ms 69212 KB Output is correct
31 Correct 375 ms 76516 KB Output is correct
32 Correct 283 ms 76284 KB Output is correct
33 Correct 310 ms 77032 KB Output is correct
34 Correct 5 ms 17752 KB Output is correct
35 Correct 7 ms 18012 KB Output is correct
36 Correct 136 ms 47004 KB Output is correct
37 Correct 216 ms 62336 KB Output is correct
38 Correct 281 ms 76156 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 17500 KB Output is correct
2 Correct 4 ms 17500 KB Output is correct
3 Correct 4 ms 17496 KB Output is correct
4 Correct 4 ms 17500 KB Output is correct
5 Correct 4 ms 17500 KB Output is correct
6 Correct 4 ms 17500 KB Output is correct
7 Correct 5 ms 17500 KB Output is correct
8 Correct 4 ms 17500 KB Output is correct
9 Correct 131 ms 49128 KB Output is correct
10 Correct 15 ms 20568 KB Output is correct
11 Correct 69 ms 34244 KB Output is correct
12 Correct 21 ms 22104 KB Output is correct
13 Correct 15 ms 20584 KB Output is correct
14 Correct 4 ms 17500 KB Output is correct
15 Correct 5 ms 17500 KB Output is correct
16 Correct 128 ms 49096 KB Output is correct
17 Correct 4 ms 17752 KB Output is correct
18 Correct 4 ms 17500 KB Output is correct
19 Correct 4 ms 17324 KB Output is correct
20 Correct 4 ms 17500 KB Output is correct
21 Correct 4 ms 17500 KB Output is correct
22 Correct 4 ms 17500 KB Output is correct
23 Correct 283 ms 76856 KB Output is correct
24 Correct 4 ms 17500 KB Output is correct
25 Correct 6 ms 18144 KB Output is correct
26 Correct 5 ms 17500 KB Output is correct
27 Correct 5 ms 17500 KB Output is correct
28 Correct 106 ms 41044 KB Output is correct
29 Correct 162 ms 52852 KB Output is correct
30 Correct 218 ms 64508 KB Output is correct
31 Correct 290 ms 76944 KB Output is correct
32 Correct 4 ms 17496 KB Output is correct
33 Correct 4 ms 17500 KB Output is correct
34 Correct 5 ms 17340 KB Output is correct
35 Correct 4 ms 17496 KB Output is correct
36 Correct 4 ms 17500 KB Output is correct
37 Correct 4 ms 17500 KB Output is correct
38 Correct 4 ms 17496 KB Output is correct
39 Correct 4 ms 17500 KB Output is correct
40 Correct 4 ms 17496 KB Output is correct
41 Correct 4 ms 17500 KB Output is correct
42 Correct 4 ms 17500 KB Output is correct
43 Correct 5 ms 17500 KB Output is correct
44 Correct 5 ms 17596 KB Output is correct
45 Correct 132 ms 47464 KB Output is correct
46 Correct 205 ms 59976 KB Output is correct
47 Correct 197 ms 60060 KB Output is correct
48 Correct 4 ms 17500 KB Output is correct
49 Correct 4 ms 17500 KB Output is correct
50 Correct 4 ms 17500 KB Output is correct
51 Correct 4 ms 17500 KB Output is correct
52 Correct 4 ms 17500 KB Output is correct
53 Correct 4 ms 17340 KB Output is correct
54 Correct 4 ms 17500 KB Output is correct
55 Correct 281 ms 76200 KB Output is correct
56 Correct 4 ms 17496 KB Output is correct
57 Correct 2886 ms 18032 KB Output is correct
58 Correct 12 ms 19288 KB Output is correct
59 Correct 10 ms 18012 KB Output is correct
60 Correct 133 ms 47016 KB Output is correct
61 Correct 259 ms 59692 KB Output is correct
62 Correct 235 ms 66468 KB Output is correct
63 Incorrect 3089 ms 68428 KB Solution announced impossible, but it is possible.
64 Halted 0 ms 0 KB -