10749 2024. 04. 11 08:10:14 szil Útvonalak cpp17 Elfogadva 100/100 294ms 137884 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int MAXN = 400'001;
const int MAXK = 20;

vector<int> g[MAXN], g2[MAXN];
vector<int> st;
vector<vector<int>> comp;
int tin2[MAXN], low[MAXN], siz[MAXN], bcc[MAXN], timer = 1, nodes = 0, up[MAXN][MAXK], pref[MAXN], tin[MAXN], tout[MAXN], fok[MAXN];
bool is_art[MAXN];

void dfs(int u, int p = -1) {
    tin2[u] = low[u] = timer++;
    st.emplace_back(u);
    int cc = 0;
    for (int v : g[u]) {
        if (v == p) continue;
        if (tin2[v]) {
            low[u] = min(low[u], tin2[v]);
        } else {
            cc++;
            dfs(v, u);
            low[u] = min(low[u], low[v]);
            if (tin2[u] <= low[v]) {
                is_art[u] = (tin2[u] > 1 || tin2[v] > 2);
                comp.push_back({u});
                while (st.back() != v) {
                    comp.back().emplace_back(st.back());
                    st.pop_back();
                }
                st.pop_back();
                comp.back().emplace_back(v);
            }
        }
    }
}

void dfs2(int u, int p = -1) {
    tin[u] = timer++;
    pref[u] += siz[u];
    for (int v : g2[u]) {
        if (v != p) {
            pref[v] += pref[u];
            up[v][0] = u;
            dfs2(v, u);
        }
    }
    tout[u] = timer++;
}

bool is_ancestor(int u, int v) {
    return tin[u] <= tin[v] && tout[v] <= tout[u];
}

int lca(int u, int v) {
    if (is_ancestor(u, v)) return u;
    if (is_ancestor(v, u)) return v;
    for (int k = MAXK - 1; k >= 0; k--) {
        if (up[u][k] && !is_ancestor(up[u][k], v)) {
            u = up[u][k];
        }
    }
    return up[u][0];
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n, m, q; cin >> n >> m >> q;
    for (int i = 0; i < m; i++) {
        int u, v; cin >> u >> v;
        g[u].emplace_back(v);
        g[v].emplace_back(u);
        fok[u]++;
        fok[v]++;
    }
    dfs(1);
    for (int i = 1; i <= n; i++) {
        if (is_art[i]) {
            bcc[i] = ++nodes;
            siz[bcc[i]] = 1;
        }
    }

    vector<int> idx(MAXN);
    for (int i = 0; i < comp.size(); i++) {
        int t = ++nodes;
        idx[i] = t;
        for (int j : comp[i]) {
            if (!is_art[j]) {
                bcc[j] = t;
            }
        }
        siz[t] = comp[i].size() - 2;
    }

    for (int i = 0; i < comp.size(); i++) {
        for (int j : comp[i]) {
            if (is_art[j]) {
                g2[idx[i]].emplace_back(bcc[j]);
                g2[bcc[j]].emplace_back(idx[i]);
            }
        }
    }

    for (int i = 1; i <= n; i++) {
        sort(g2[i].begin(), g2[i].end());
        g2[i].erase(unique(g2[i].begin(), g2[i].end()), g2[i].end());
    }

    timer = 1;
    dfs2(1);

/*
    for (int i = 1; i <= n; i++) {
        cerr << pref[bcc[i]] << " ";
    }
    cerr << endl;*/
    for (int k = 1; k < MAXK; k++) {
        for (int i = 1; i <= nodes; i++) {
            up[i][k] = up[up[i][k-1]][k-1];
        }
    }

    while (q--) {
        int u, v; cin >> u >> v;
        int nu = bcc[u], nv = bcc[v];
        int l = lca(nu, nv);
        int ans = pref[nu] + pref[nv] - 2 * pref[l] + siz[l];
        if (is_art[u]) ans--;
        if (is_art[v]) ans--;
        cout << ans << "\n";
        // cerr << "lca = " << lca(u, v) << endl;
    }
    
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 17ms 42400 KiB
2 Elfogadva 86ms 55484 KiB
subtask2 15/15
3 Elfogadva 17ms 42936 KiB
4 Elfogadva 18ms 43064 KiB
5 Elfogadva 21ms 46428 KiB
6 Elfogadva 24ms 44672 KiB
7 Elfogadva 54ms 49944 KiB
8 Elfogadva 82ms 56204 KiB
subtask3 15/15
9 Elfogadva 17ms 44220 KiB
10 Elfogadva 19ms 44620 KiB
11 Elfogadva 21ms 46820 KiB
12 Elfogadva 32ms 49304 KiB
13 Elfogadva 82ms 73136 KiB
14 Elfogadva 155ms 102452 KiB
15 Elfogadva 294ms 128928 KiB
subtask4 15/15
16 Elfogadva 19ms 44048 KiB
17 Elfogadva 19ms 44432 KiB
18 Elfogadva 24ms 45600 KiB
19 Elfogadva 50ms 50720 KiB
20 Elfogadva 85ms 56872 KiB
subtask5 15/15
21 Elfogadva 21ms 44144 KiB
22 Elfogadva 18ms 44400 KiB
23 Elfogadva 18ms 45400 KiB
24 Elfogadva 17ms 44748 KiB
25 Elfogadva 17ms 44676 KiB
26 Elfogadva 17ms 44820 KiB
subtask6 40/40
27 Elfogadva 21ms 44724 KiB
28 Elfogadva 86ms 57368 KiB
29 Elfogadva 17ms 42936 KiB
30 Elfogadva 18ms 43064 KiB
31 Elfogadva 21ms 46428 KiB
32 Elfogadva 24ms 44672 KiB
33 Elfogadva 54ms 49944 KiB
34 Elfogadva 82ms 56204 KiB
35 Elfogadva 17ms 44220 KiB
36 Elfogadva 19ms 44620 KiB
37 Elfogadva 21ms 46820 KiB
38 Elfogadva 32ms 49304 KiB
39 Elfogadva 82ms 73136 KiB
40 Elfogadva 155ms 102452 KiB
41 Elfogadva 294ms 128928 KiB
42 Elfogadva 19ms 44048 KiB
43 Elfogadva 19ms 44432 KiB
44 Elfogadva 24ms 45600 KiB
45 Elfogadva 50ms 50720 KiB
46 Elfogadva 85ms 56872 KiB
47 Elfogadva 21ms 44144 KiB
48 Elfogadva 18ms 44400 KiB
49 Elfogadva 18ms 45400 KiB
50 Elfogadva 17ms 44748 KiB
51 Elfogadva 17ms 44676 KiB
52 Elfogadva 17ms 44820 KiB
53 Elfogadva 273ms 133612 KiB
54 Elfogadva 19ms 45044 KiB
55 Elfogadva 21ms 48284 KiB
56 Elfogadva 26ms 46444 KiB
57 Elfogadva 64ms 51464 KiB
58 Elfogadva 57ms 52820 KiB
59 Elfogadva 289ms 137884 KiB
60 Elfogadva 119ms 57096 KiB
61 Elfogadva 123ms 58600 KiB
62 Elfogadva 120ms 59644 KiB