답안 #965045

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
965045 2024-04-18T04:16:18 Z Pannda 자매 도시 (APIO20_swap) C++17
17 / 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), siz(n, 1), 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 = 350;
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]);
        }
    }
    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 = b - 1;
    while (dsus[b0].same(X, Y) && dsus[b0].isOk(X)) b0--;
    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;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 428 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 109 ms 214868 KB Output is correct
10 Correct 161 ms 319308 KB Output is correct
11 Correct 146 ms 310240 KB Output is correct
12 Correct 157 ms 345940 KB Output is correct
13 Correct 168 ms 345920 KB Output is correct
14 Correct 112 ms 214100 KB Output is correct
15 Correct 184 ms 326880 KB Output is correct
16 Correct 192 ms 307604 KB Output is correct
17 Correct 195 ms 347832 KB Output is correct
18 Correct 190 ms 347836 KB Output is correct
19 Correct 288 ms 13276 KB Output is correct
20 Correct 267 ms 333660 KB Output is correct
21 Correct 388 ms 303456 KB Output is correct
22 Execution timed out 2044 ms 347452 KB Time limit exceeded
23 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 428 KB Output is correct
3 Execution timed out 2072 ms 313108 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 428 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 0 ms 344 KB Output is correct
10 Correct 1 ms 344 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 348 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 344 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 1 ms 348 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 348 KB Output is correct
24 Correct 1 ms 348 KB Output is correct
25 Correct 1 ms 600 KB Output is correct
26 Correct 1 ms 348 KB Output is correct
27 Correct 1 ms 348 KB Output is correct
28 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 0 ms 428 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 109 ms 214868 KB Output is correct
11 Correct 161 ms 319308 KB Output is correct
12 Correct 146 ms 310240 KB Output is correct
13 Correct 157 ms 345940 KB Output is correct
14 Correct 168 ms 345920 KB Output is correct
15 Correct 1 ms 344 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 348 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 348 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 600 KB Output is correct
31 Correct 1 ms 348 KB Output is correct
32 Correct 1 ms 348 KB Output is correct
33 Correct 1 ms 348 KB Output is correct
34 Correct 7 ms 7256 KB Output is correct
35 Correct 169 ms 345924 KB Output is correct
36 Correct 156 ms 345868 KB Output is correct
37 Correct 155 ms 345964 KB Output is correct
38 Correct 151 ms 337696 KB Output is correct
39 Correct 147 ms 333144 KB Output is correct
40 Correct 140 ms 279712 KB Output is correct
41 Correct 154 ms 345936 KB Output is correct
42 Correct 156 ms 345936 KB Output is correct
43 Correct 157 ms 345832 KB Output is correct
44 Correct 155 ms 345936 KB Output is correct
45 Correct 200 ms 399696 KB Output is correct
46 Correct 156 ms 345892 KB Output is correct
47 Correct 162 ms 347068 KB Output is correct
48 Correct 177 ms 371740 KB Output is correct
49 Correct 57 ms 11764 KB Output is correct
50 Correct 49 ms 35152 KB Output is correct
51 Correct 145 ms 286664 KB Output is correct
52 Runtime error 286 ms 524288 KB Execution killed with signal 9
53 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 428 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 109 ms 214868 KB Output is correct
10 Correct 161 ms 319308 KB Output is correct
11 Correct 146 ms 310240 KB Output is correct
12 Correct 157 ms 345940 KB Output is correct
13 Correct 168 ms 345920 KB Output is correct
14 Correct 112 ms 214100 KB Output is correct
15 Correct 184 ms 326880 KB Output is correct
16 Correct 192 ms 307604 KB Output is correct
17 Correct 195 ms 347832 KB Output is correct
18 Correct 190 ms 347836 KB Output is correct
19 Execution timed out 2072 ms 313108 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 0 ms 428 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 109 ms 214868 KB Output is correct
11 Correct 161 ms 319308 KB Output is correct
12 Correct 146 ms 310240 KB Output is correct
13 Correct 157 ms 345940 KB Output is correct
14 Correct 168 ms 345920 KB Output is correct
15 Correct 112 ms 214100 KB Output is correct
16 Correct 184 ms 326880 KB Output is correct
17 Correct 192 ms 307604 KB Output is correct
18 Correct 195 ms 347832 KB Output is correct
19 Correct 190 ms 347836 KB Output is correct
20 Execution timed out 2072 ms 313108 KB Time limit exceeded
21 Halted 0 ms 0 KB -