Submission #965055

# Submission time Handle Problem Language Result Execution time Memory
965055 2024-04-18T04:25:48 Z Pannda Swapping Cities (APIO20_swap) C++17
23 / 100
2000 ms 524288 KB
#include "swap.h"

#include <bits/stdc++.h>
using namespace std;

struct DSU {
    vector<int> f;
//    vector<int> siz;
    vector<int> deg;
    vector<bool> ok;

    DSU(int n) : f(n), deg(n, 0), ok(n, false) { iota(f.begin(), f.end(), 0); }

    int leader(int u) {
        while (u != f[u]) u = f[u] = f[f[u]];
        return u;
    }

    bool unionize(int u0, int v0) {
        int u = leader(u0);
        int v = leader(v0);
        if (u == v) {
            ok[u] = true;
            return false;
        }
//        if (siz[u] > siz[v]) swap(u, v);
//        siz[v] += siz[u];
        if (++deg[u0] >= 3 || ++deg[v0] >= 3) ok[v] = true;
        ok[v] = ok[v] | ok[u];
        f[u] = v;
        return true;
    }

    bool same(int u, int v) {
        return leader(u) == leader(v);
    }

    bool isOk(int u) {
        return ok[leader(u)];
    }
};

struct LiteDSU {
    vector<int> f;
    vector<int> siz;
    vector<bool> ok;

    LiteDSU(int n) : f(n), siz(n, 1), ok(n, false) { iota(f.begin(), f.end(), 0); }

    int leader(int u) {
        while (u != f[u]) u = f[u] = f[f[u]];
        return u;
    }

    bool unionize(int u, int v) {
        u = leader(u);
        v = leader(v);
        if (u == v) return false;
        if (siz[u] > siz[v]) swap(u, v);
        siz[v] += siz[u];
        ok[v] = ok[v] | ok[u];
        f[u] = v;
        return true;
    }

    bool same(int u, int v) {
        return leader(u) == leader(v);
    }

    bool isOk(int u) {
        return ok[leader(u)];
    }
};

int n, m;
vector<array<int, 3>> edges;
const int B = 300;
vector<DSU> dsus;
int b;
vector<int> mp;

void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) {
    n = N;
    m = M;
    edges.resize(m);
    for (int i = 0; i < m; i++) {
        edges[i] = {U[i], V[i], W[i]};
    }
    sort(edges.begin(), edges.end(), [&](array<int, 3> e0, array<int, 3> e1) { return e0[2] < e1[2]; });

    dsus.emplace_back(n);
    for (b = 0; B * b < m; b++) {
        dsus.push_back(dsus.back());
        for (int i = B * b; i < min(m, B * b + B); i++) {
            dsus.back().unionize(edges[i][0], edges[i][1]);
        }
        for (int u = 0; u < n; u++) dsus.back().leader(u);
    }
    b++;

    mp.resize(n, -1);
}

int getMinimumFuelCapacity(int X, int Y) {
    if (!dsus.back().same(X, Y) || !dsus.back().isOk(X)) return -1;
    int b0 = [&]() -> int {
        int l = 0, r = b - 2;
        while (l < r) {
            int m = (l + r + 1) >> 1;
            if (!dsus[m].same(X, Y) || !dsus[m].isOk(X)) {
                l = m;
            } else {
                r = m - 1;
            }
        }
        return l;
    }();
    vector<int> dom;
    for (int i = B * b0; i < min(m, B * b0 + B); i++) {
        if (dsus[b0 + 1].same(X, edges[i][0]) || dsus[b0 + 1].same(X, edges[i][1])) {
            int u = dsus[b0].leader(edges[i][0]);
            int v = dsus[b0].leader(edges[i][1]);
            if (mp[u] == -1) mp[u] = 0, dom.push_back(u);
            if (mp[v] == -1) mp[v] = 0, dom.push_back(v);
        }
    }
    int c = dom.size();
    int label = 0;
    for (int u : dom) mp[u] = label++;
    int x = mp[dsus[b0].leader(X)];
    int y = mp[dsus[b0].leader(Y)];
    LiteDSU dsu(c);
    int res = -2;
    vector<int> defer;
    for (int u : dom) if (dsus[b0].isOk(u)) dsu.ok[mp[u]] = true;
    for (int i = B * b0; i < min(m, B * b0 + B); i++) {
        if (dsus[b0 + 1].same(X, edges[i][0]) || dsus[b0 + 1].same(X, edges[i][1])) {
            int u = mp[dsus[b0].leader(edges[i][0])];
            int v = mp[dsus[b0].leader(edges[i][1])];
            if (dsu.same(u, v)) {
                dsu.ok[dsu.leader(u)] = true;
            } else {
                defer.push_back(edges[i][0]);
                defer.push_back(edges[i][1]);
                if (++dsus[b0].deg[edges[i][0]] >= 3) dsu.ok[dsu.leader(u)] = true;
                if (++dsus[b0].deg[edges[i][1]] >= 3) dsu.ok[dsu.leader(v)] = true;
                dsu.unionize(u, v);
            }
            if (dsu.same(x, y) && dsu.isOk(x)) {
                res = edges[i][2];
                break;
            }
        }
    }
    for (int u : defer) dsus[b0].deg[u]--;
    for (int u : dom) mp[u] = -1;
    return res;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 600 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 344 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 157 ms 168284 KB Output is correct
10 Correct 224 ms 250428 KB Output is correct
11 Correct 218 ms 243280 KB Output is correct
12 Correct 243 ms 271536 KB Output is correct
13 Correct 248 ms 271440 KB Output is correct
14 Correct 154 ms 167760 KB Output is correct
15 Correct 264 ms 256456 KB Output is correct
16 Correct 238 ms 241772 KB Output is correct
17 Correct 285 ms 273492 KB Output is correct
18 Correct 316 ms 273228 KB Output is correct
19 Correct 1502 ms 11248 KB Output is correct
20 Correct 1374 ms 261888 KB Output is correct
21 Correct 1626 ms 238320 KB Output is correct
22 Correct 1514 ms 274628 KB Output is correct
23 Correct 1146 ms 279044 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Execution timed out 2021 ms 245468 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 600 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 344 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
15 Correct 1 ms 348 KB Output is correct
16 Correct 1 ms 348 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 1 ms 348 KB Output is correct
20 Correct 1 ms 348 KB Output is correct
21 Correct 1 ms 344 KB Output is correct
22 Correct 1 ms 348 KB Output is correct
23 Correct 1 ms 348 KB Output is correct
24 Correct 1 ms 348 KB Output is correct
25 Correct 1 ms 348 KB Output is correct
26 Correct 1 ms 344 KB Output is correct
27 Correct 1 ms 348 KB Output is correct
28 Correct 1 ms 344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 600 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 157 ms 168284 KB Output is correct
11 Correct 224 ms 250428 KB Output is correct
12 Correct 218 ms 243280 KB Output is correct
13 Correct 243 ms 271536 KB Output is correct
14 Correct 248 ms 271440 KB Output is correct
15 Correct 1 ms 348 KB Output is correct
16 Correct 1 ms 348 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 1 ms 348 KB Output is correct
20 Correct 1 ms 348 KB Output is correct
21 Correct 1 ms 348 KB Output is correct
22 Correct 1 ms 348 KB Output is correct
23 Correct 1 ms 344 KB Output is correct
24 Correct 1 ms 348 KB Output is correct
25 Correct 1 ms 348 KB Output is correct
26 Correct 1 ms 344 KB Output is correct
27 Correct 1 ms 348 KB Output is correct
28 Correct 1 ms 348 KB Output is correct
29 Correct 1 ms 348 KB Output is correct
30 Correct 1 ms 348 KB Output is correct
31 Correct 1 ms 344 KB Output is correct
32 Correct 1 ms 348 KB Output is correct
33 Correct 1 ms 344 KB Output is correct
34 Correct 10 ms 6044 KB Output is correct
35 Correct 259 ms 271440 KB Output is correct
36 Correct 226 ms 271444 KB Output is correct
37 Correct 230 ms 270620 KB Output is correct
38 Correct 215 ms 264916 KB Output is correct
39 Correct 211 ms 260576 KB Output is correct
40 Correct 198 ms 219476 KB Output is correct
41 Correct 234 ms 271432 KB Output is correct
42 Correct 227 ms 271720 KB Output is correct
43 Correct 237 ms 271440 KB Output is correct
44 Correct 235 ms 271444 KB Output is correct
45 Correct 264 ms 313664 KB Output is correct
46 Correct 225 ms 271436 KB Output is correct
47 Correct 224 ms 271500 KB Output is correct
48 Correct 295 ms 291532 KB Output is correct
49 Correct 50 ms 10476 KB Output is correct
50 Correct 50 ms 28500 KB Output is correct
51 Correct 209 ms 225148 KB Output is correct
52 Correct 370 ms 437332 KB Output is correct
53 Correct 454 ms 484180 KB Output is correct
54 Runtime error 446 ms 524288 KB Execution killed with signal 9
55 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 600 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 344 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 157 ms 168284 KB Output is correct
10 Correct 224 ms 250428 KB Output is correct
11 Correct 218 ms 243280 KB Output is correct
12 Correct 243 ms 271536 KB Output is correct
13 Correct 248 ms 271440 KB Output is correct
14 Correct 154 ms 167760 KB Output is correct
15 Correct 264 ms 256456 KB Output is correct
16 Correct 238 ms 241772 KB Output is correct
17 Correct 285 ms 273492 KB Output is correct
18 Correct 316 ms 273228 KB Output is correct
19 Execution timed out 2021 ms 245468 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 1 ms 600 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 157 ms 168284 KB Output is correct
11 Correct 224 ms 250428 KB Output is correct
12 Correct 218 ms 243280 KB Output is correct
13 Correct 243 ms 271536 KB Output is correct
14 Correct 248 ms 271440 KB Output is correct
15 Correct 154 ms 167760 KB Output is correct
16 Correct 264 ms 256456 KB Output is correct
17 Correct 238 ms 241772 KB Output is correct
18 Correct 285 ms 273492 KB Output is correct
19 Correct 316 ms 273228 KB Output is correct
20 Execution timed out 2021 ms 245468 KB Time limit exceeded
21 Halted 0 ms 0 KB -