110022024-06-04 11:13:24gortomiÚtvonalakcpp17Futási hiba 15/100146ms28944 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > g, comp, g2;
vector<int> t, l;
vector<bool> c;
stack<int> s;
int tim = 0, k = 0;
void dfs(int v, int pa)
{
    t[v] = l[v] = ++tim;
    s.push(v);
    for(auto x : g[v])
    {
        if(x == pa) continue;
        if(t[x] == 0)
        {
            dfs(x, v);
            l[v] = min(l[v], l[x]);
            if(l[x] < t[v]) continue;
            //cout << x << "\n";
            if(t[v] != 1 || t[x] != 2) c[v] = 1;
            comp.push_back({});
            comp[k].push_back(v);
            while(s.top() != x)
            {
                comp[k].push_back(s.top());
                s.pop();
            }
            comp[k].push_back(x);
            s.pop();
            k++;
        }
        else l[v] = min(l[v], t[x]);
    }
}
vector<int> pref, d;
vector<vector<int> > p;
void dfs2(int v, int pa)
{

    d[v] = d[pa] + 1;
    p[v][0] = pa;
    pref[v] = pref[pa] + (v >= k ? -1 : comp[v].size());
    for(int j = 1; j < 20; j++)
    {
        p[v][j] = p[p[v][j - 1]][j - 1];
    }
    for(auto x : g2[v])
    {
        if(x == pa) continue;
        dfs2(x, v);
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, m, q;
    cin >> n >> m >> q;
    g.resize(n + 1);
    t.resize(n + 1);
    l.resize(n + 1);
    c.resize(n + 1);
    for(int i = 0; i < m; i++)
    {
        int x, y;
        cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(1, 0);
    g2.resize(n + 1);
    vector<int> ind(n + 1);
    vector<int> id(n + 1);
    int z = k;
    for(int i = 1; i <= n; i++)
    {
        if(c[i]) ind[i] = z++, id[i] = ind[i];
    }
    for(int i = 0; i < k; i++)
    {
        for(auto x : comp[i])
        {
            if(c[x])
            {
                int pos = ind[x];
                g2[pos].push_back(i);
                g2[i].push_back(pos);
            }
            else id[x] = i;
        }
    }
    pref.resize(2 * n + 1);
    d.resize(n + 1);
    p.resize(n + 1, vector<int>(20));
    dfs2(0, z);
    while(q--)
    {
        int x, y;
        cin >> x >> y;

        int ans = 0;
        if(!c[x]) ans--;
        if(!c[y]) ans--;

        x = id[x];
        y = id[y];
        ans += pref[x] + pref[y];
        if(d[y] < d[x]) swap(x, y);
        int diff = d[y] - d[x];
        for(int j = 0; j < 20; j++)
        {
            if((diff >> j) & 1)
            {
                y = p[y][j];
            }
        }
        for(int j = 19; j >= 0; j--)
        {
            if(p[x][j] != p[y][j])
            {
                x = p[x][j];
                y = p[y][j];
            }
        }
        if(x != y)
        {
            x = p[x][0];

        }
        ans -= pref[x];
        ans -= pref[p[x][0]];
        cout << ans << "\n";
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms632 KiB
2Elfogadva101ms25780 KiB
subtask20/15
3Elfogadva3ms612 KiB
4Elfogadva4ms868 KiB
5Futási hiba4ms1604 KiB
6Elfogadva10ms2916 KiB
7Elfogadva43ms13152 KiB
8Elfogadva93ms25468 KiB
subtask30/15
9Futási hiba3ms880 KiB
10Futási hiba4ms916 KiB
11Futási hiba6ms1656 KiB
12Futási hiba8ms2224 KiB
13Futási hiba32ms8728 KiB
14Futási hiba76ms16900 KiB
15Futási hiba78ms24772 KiB
subtask415/15
16Elfogadva4ms1036 KiB
17Elfogadva6ms1508 KiB
18Elfogadva10ms3200 KiB
19Elfogadva46ms12956 KiB
20Elfogadva100ms25696 KiB
subtask50/15
21Elfogadva3ms632 KiB
22Elfogadva3ms540 KiB
23Futási hiba3ms1036 KiB
24Elfogadva3ms784 KiB
25Elfogadva3ms620 KiB
26Elfogadva3ms760 KiB
subtask60/40
27Elfogadva2ms356 KiB
28Elfogadva97ms23712 KiB
29Elfogadva3ms612 KiB
30Elfogadva4ms868 KiB
31Futási hiba4ms1604 KiB
32Elfogadva10ms2916 KiB
33Elfogadva43ms13152 KiB
34Elfogadva93ms25468 KiB
35Futási hiba3ms880 KiB
36Futási hiba4ms916 KiB
37Futási hiba6ms1656 KiB
38Futási hiba8ms2224 KiB
39Futási hiba32ms8728 KiB
40Futási hiba76ms16900 KiB
41Futási hiba78ms24772 KiB
42Elfogadva4ms1036 KiB
43Elfogadva6ms1508 KiB
44Elfogadva10ms3200 KiB
45Elfogadva46ms12956 KiB
46Elfogadva100ms25696 KiB
47Elfogadva3ms632 KiB
48Elfogadva3ms540 KiB
49Futási hiba3ms1036 KiB
50Elfogadva3ms784 KiB
51Elfogadva3ms620 KiB
52Elfogadva3ms760 KiB
53Futási hiba76ms26736 KiB
54Elfogadva4ms996 KiB
55Futási hiba4ms1636 KiB
56Elfogadva14ms3172 KiB
57Elfogadva64ms13876 KiB
58Elfogadva57ms15712 KiB
59Futási hiba82ms28944 KiB
60Elfogadva146ms26972 KiB
61Elfogadva136ms27364 KiB
62Elfogadva135ms27436 KiB