Submission #1362305

#TimeUsernameProblemLanguageResultExecution timeMemory
1362305SulASwapping Cities (APIO20_swap)C++20
0 / 100
2 ms580 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 300000, K = 19;
vector<int> adj[N];
int par[N], comp[N], deg[N], cycle[N], deg3[N];
int T[K][N], wei[K][N], dep[N];
int nxt = 0, tim = 0;

int find(int u) {
    return par[comp[u]] == comp[u]
    ? comp[u]
    : comp[u] = find(par[u]);
}

void merge(int u, int v, int w) {
    int d = max(++deg[u], ++deg[v]);
    u = find(u), v = find(v);
    par[u] = par[v] = nxt;
    cycle[nxt] = u == v | cycle[u] | cycle[v];
    deg3[nxt] = d == 3 | deg3[u] | deg3[v];
    par[nxt] = comp[nxt] = nxt;
    adj[nxt].push_back(u);
    if (u != v)
        adj[nxt].push_back(v);
    wei[0][u] = wei[0][v] = w;
    nxt++;
}

void dfs(int u, int p = -1) {
    for (int v : adj[u]) {
        if (v == p) continue;
        dep[v] = dep[u] + 1;
        dfs(v, u);
    }
}

void init(int n, int m, vector<int> U, vector<int> V, vector<int> W) {
    vector<int> edges(m);
    for (int i = 0; i < m; i++) edges[i] = i;
    sort(edges.begin(), edges.end(), [&](int i, int j) { return W[i] < W[j]; });

    for (int i = 0; i < n; i++) {
        par[i] = comp[i] = i;
        nxt++;
    }
    for (int i : edges) {
        merge(U[i], V[i], W[i]);
    }

    for (int u = 0; u < n+m; u++)
        T[0][u] = par[u];
    for (int i = 0; i < K-1; i++) {
        for (int u = 0; u < n+m; u++) {
            T[i+1][u] = T[i][T[i][u]];
            wei[i+1][u] = max(wei[i][u], wei[i][ T[i][u] ]);
        }
    }
    for (int u = 0; u < n+m; u++) {
        for (int i = 0; i < K; cout << T[i++][u] << " ");
        cout << "\n";
    }

    dfs(find(0));
}

int getMinimumFuelCapacity(int x, int y) {
    int ans = 0;
    if (dep[x] > dep[y]) swap(x, y);
    int d = dep[y] - dep[x];
    for (int i = 0; i < K; i++) if ((d >> i) & 1) {
//        cout << i << " " << y << " " << wei[i][y] << "\n";
        ans = max(ans, wei[i][y]);
        y = T[i][y];
    }
    if (x != y) {
        for (int i = K-1; i >= 0; i--) {
            if (T[i][x] != T[i][y]) {
//                cout << i << " " << x << " " << wei[i][x] << "\n";
//                cout << i << " " << y << " " << wei[i][y] << "\n";
                ans = max(ans, max(wei[i][x], wei[i][y]));
                x = T[i][x];
                y = T[i][y];
            }
        }
        ans = max(ans, max(wei[0][x], wei[0][y]));
//        cout << "0 " << x << " " << wei[0][x] << "\n";
//        cout << "0 " << y << " " << wei[0][y] << "\n";
        x = T[0][x];
        y = T[0][y];
    }
    if (cycle[x] | deg3[x]) return ans;
    for (int i = K-1; i >= 0; i--) {
        if (!cycle[T[i][x]] && !deg3[T[i][x]]) {
//            cout << i << " " << x << " " << wei[i][x] << "\n";
            ans = max(ans, wei[i][x]);
            x = T[i][x];
        }
    }
//    cout << "0 " << x << " " << wei[0][x];
    ans = max(ans, wei[0][x]);
    x = T[0][x];
    if (cycle[x] | deg3[x]) return ans;
    return -1;
}

//int main() {
//    init(5, 6, {0, 0, 1, 1, 1, 2}, {1, 2, 2, 3, 4, 3}, {4, 4, 1, 2, 10, 3});
//    cout << getMinimumFuelCapacity(1, 2) << '\n';
//    cout << getMinimumFuelCapacity(2, 4) << "\n";
//    cout << getMinimumFuelCapacity(0, 1) << "\n";
//}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...