110042024-06-04 11:33:32UVinceÚtvonalakcpp17Hibás válasz 0/100333ms103628 KiB
#include <bits/stdc++.h>
using namespace std;
using ll=long long;


void solve();

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

    int t=1;
    //cin>>t;
    while (t--) solve();
}

const int maxn=4e5+1;

int n,m,k;
vector<vector<int>> g(maxn);
vector<int> t(maxn, -1),l(maxn, -1);
vector<bool> vis(maxn,false);
int timer=0;
stack<int> st;
vector<vector<int>> comps;
vector<int> art(maxn);
vector<int> comp(maxn,-1);
void dfs(int v, int p=-1){
    t[v]=l[v]=++timer;
    vis[v]=true;
    st.push(v);
    for (int to : g[v]){
        if (p==to) continue;
        if (vis[to]){
            l[v]=min(l[v], t[to]);
        }
        else {
            dfs(to, v);
            l[v]=min(l[v], l[to]);

            if (l[to]>=t[v]){
                art[v]= (t[v]>1 || t[to]>2);
                comps.push_back({v});
                comp[v]=comps.size()-1;
                while (comps.back().back()!=to){
                    comps.back().push_back(st.top());
                    comp[st.top()]=comps.size()-1;
                    st.pop();
                }
            }
        }
    }
}


vector<bool> bctvis(maxn,false);
vector<vector<int>> bctg(maxn);

void bct(int v){
    bctvis[v]=true;
    if (comps[v].size()==1){
        for (int to : g[comps[v][0]]){
            if (!bctvis[comp[to]]) bct(comp[to]);
        }
    }else {
        for (int node : comps[v]){
            if (art[node]){
                bctg[v].push_back(comp[node]);
                if (!bctvis[comp[node]]) bct(comp[node]);
            }
        }
    }
}

vector<int> pr(maxn,1);
vector<vector<int>> binary(maxn, vector<int> (20, 0));
vector<int> layer(maxn, -1);

void pref(int v, int p=-1){
    pr[v]=pr[max(p,0)]-1+comps[v].size();
    layer[v]=layer[max(p,0)]+1;
    if (p!=-1){
        binary[v][0]=p;
        for (int i=1;i<20;i++){
            binary[v][i]=binary[binary[v][i-1]][i-1];
        }
    }
    for (int to : bctg[v]){
        if (to==p) continue;
        pref(to,v);
    }
}

int lca(int a,int b){
    if (layer[a]<layer[b]) swap(a,b);
    if (layer[a]>layer[b]){
        for (int i=19;i>=0;i--){
            int c=binary[a][i];
            if (layer[c]<=layer[b]) continue;
            a=c;
        }
        a=binary[a][0];
    }
    if (a==b) return a;
    for (int i=19;i>=0;i--){
        int c=binary[a][i];
        int d=binary[b][i];
        if (c==d) continue;
        a=c;
        b=d;
    }
    return binary[a][0];
}

void solve(){
    cin>>n>>m>>k;
    for (int i = 0; i < m; i++)
    {
        int a,b;
        cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    dfs(1);
    for (int i=1;i<=n;i++){
        if (art[i]){
            comps.push_back({i});
            comp[i]=comps.size()-1;
        }
    }
    for (int i=0;i<comps.size();i++){
        if (comps[i].size()==1) continue;
        for (int j : comps[i]){
            if (art[j]) bctg[comp[j]].push_back(i);
        }
    }
    bct(0);
    pref(0);

    for (int i = 0; i < k; i++)
    {
        int a,b;
        cin>>a>>b;

        a=comp[a];
        b=comp[b];

        int c = lca(a,b);

        cout<<pr[a]+pr[b]-2*pr[c]+comps[c].size()-2<<"\n";
    }
    

}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva71ms75620 KiB
2Hibás válasz152ms80224 KiB
subtask20/15
3Elfogadva75ms75752 KiB
4Hibás válasz90ms75784 KiB
5Hibás válasz76ms76588 KiB
6Elfogadva104ms76252 KiB
7Elfogadva130ms78072 KiB
8Elfogadva177ms80184 KiB
subtask30/15
9Hibás válasz75ms76024 KiB
10Hibás válasz82ms75900 KiB
11Hibás válasz78ms76648 KiB
12Hibás válasz82ms77152 KiB
13Hibás válasz159ms83220 KiB
14Hibás válasz264ms90764 KiB
15Hibás válasz270ms101404 KiB
subtask40/15
16Hibás válasz93ms76044 KiB
17Hibás válasz101ms75908 KiB
18Hibás válasz90ms76264 KiB
19Elfogadva136ms78052 KiB
20Hibás válasz160ms80392 KiB
subtask50/15
21Elfogadva75ms75676 KiB
22Elfogadva90ms75620 KiB
23Hibás válasz75ms75876 KiB
24Hibás válasz82ms75636 KiB
25Hibás válasz89ms75748 KiB
26Hibás válasz75ms75748 KiB
subtask60/40
27Elfogadva75ms75620 KiB
28Hibás válasz202ms80256 KiB
29Elfogadva75ms75752 KiB
30Hibás válasz90ms75784 KiB
31Hibás válasz76ms76588 KiB
32Elfogadva104ms76252 KiB
33Elfogadva130ms78072 KiB
34Elfogadva177ms80184 KiB
35Hibás válasz75ms76024 KiB
36Hibás válasz82ms75900 KiB
37Hibás válasz78ms76648 KiB
38Hibás válasz82ms77152 KiB
39Hibás válasz159ms83220 KiB
40Hibás válasz264ms90764 KiB
41Hibás válasz270ms101404 KiB
42Hibás válasz93ms76044 KiB
43Hibás válasz101ms75908 KiB
44Hibás válasz90ms76264 KiB
45Elfogadva136ms78052 KiB
46Hibás válasz160ms80392 KiB
47Elfogadva75ms75676 KiB
48Elfogadva90ms75620 KiB
49Hibás válasz75ms75876 KiB
50Hibás válasz82ms75636 KiB
51Hibás válasz89ms75748 KiB
52Hibás válasz75ms75748 KiB
53Hibás válasz333ms101064 KiB
54Hibás válasz76ms75880 KiB
55Hibás válasz79ms76644 KiB
56Hibás válasz90ms76260 KiB
57Hibás válasz136ms78224 KiB
58Hibás válasz153ms78536 KiB
59Hibás válasz300ms103628 KiB
60Hibás válasz197ms80680 KiB
61Hibás válasz208ms80868 KiB
62Hibás válasz193ms80920 KiB