Submission #1106471

#TimeUsernameProblemLanguageResultExecution timeMemory
1106471vladiliusSwapping Cities (APIO20_swap)C++17
0 / 100
440 ms524288 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
#define arr3 array<int, 3>

struct dsu{
    vector<int> p, d;
    vector<bool> f;
    vector<vector<int>> A, out;
    int n;
    void init(int ns){
        n = ns;
        d.resize(n + 1);
        p.resize(n + 1);
        f.resize(n + 1);
        A.resize(n + 1);
        out.resize(n + 1);
        for (int i = 1; i <= n; i++){
            out[i].assign(n + 1, -1);
            p[i] = i;
            A[i] = {i};
        }
    }
    int get(int v){
        if (p[v] != v){
            p[v] = get(p[v]);
        }
        return p[v];
    }
    void unite(int x, int y, int w){
        int a = get(x), b = get(y);
        if (a == b){
            if (!f[a]){
                f[a] = 1;
                for (int i: A[a]){
                    for (int j: A[a]){
                        assert(out[i][j] == -1);
                        out[i][j] = w;
                    }
                }
            }
            return;
        }
        if (A[a].size() > A[b].size()) swap(a, b);
        
        if (f[a] || f[b] || d[x] >= 2 || d[y] >= 2){
            for (int i: A[a]){
                for (int j: A[b]){
                    assert(out[i][j] == -1);
                    assert(out[j][i] == -1);
                    out[i][j] = out[j][i] = w;
                }
            }
            f[b] = 1;
        }
        else {
            d[x]++; d[y]++;
        }
        
        for (int i: A[a]) A[b].pb(i);
        p[a] = b;
    }
};

dsu T;
int n, m;

void init(int N, int M, vector<int> U, vector<int> V, vector<int> W){
    n = N; m = M;
    vector<arr3> ed;
    for (int i = 0; i < m; i++){
        ed.pb({W[i], U[i] + 1, V[i] + 1});
    }
    sort(ed.begin(), ed.end());
    T.init(n);
    for (auto [f, x, y]: ed){
        T.unite(x, y, f);
    }
}

int getMinimumFuelCapacity(int x, int y){
    x++; y++;
    if (T.out[x][y] == -1 && m != (n - 1)){
        while (true){
            x++;
        }
    }
    return T.out[x][y];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...