Submission #450098

#TimeUsernameProblemLanguageResultExecution timeMemory
450098ymmDuathlon (APIO18_duathlon)C++17
57 / 100
1090 ms35648 KiB
///
///    I have a dream and a piano
///

#define _USE_MATH_DEFINES
#define FAST ios::sync_with_stdio(false),cin.tie(0);
#include <bits/stdc++.h>
#define Loop(x, l, r) for(int x = (l); x < (r); ++x)
#define LoopR(x, l, r) for(int x = (r)-1; x >= (l); --x)
#define all(x) x.begin(), x.end()
#define Kill(x) exit((cout << (x) << '\n', 0))
#define YN(flag) ((flag)? "YES": "NO")
#define F first
#define S second
typedef          long long   ll;
typedef unsigned long long  ull;
typedef std::pair<int,int>  pii;
typedef std::pair<ll ,ll >  pll;
using namespace std;

const int N = 200'010;
vector<int> A[N];
vector<int> cs[N], vs[N]; int cnt = 0;

bool vis[N];
vector<int> st, vec;
int h[N];
int p[N];
ll stree[N];
tuple<int,int,int> dfs(int v)
{
    vis[v] = 1;
    int sum = 1;
    int tsum = 1;
    int mn = h[v];
    for(int u : A[v])
    {
        if(vis[u]) mn = min(mn, h[u]);
        else {
            auto [x, y, z] = dfs((h[u] = h[v]+1, p[u]=v, u));
            tsum += x;
            if(z >= h[v]) {
                vs[cnt].push_back(v);
                cs[v].push_back(cnt);
                while(y--)
                {
                    int w = st.back(); st.pop_back();
                    cs[w].push_back(cnt);
                    vs[cnt].push_back(w);
                }
                ++cnt;
            } else {
                mn = min(z, mn);
                sum += y;
            }
        }
    }
    stree[v] = tsum;
    st.push_back(v);
    vec.push_back(v);
    return {tsum, sum, mn};
}

ll cc[N]={};

ll solve(int v)
{
    p[v] = -1;
    vec.clear();
    int l = cnt;
    ll n = (dfs(v), vec.size());
    int r = cnt;
    Loop(c,l,r)
    {
        ll fsum = 0;
        for(int v : vs[c])
        {
            ll sum = 1;
            for(int u : A[v])
                if(p[u] == v && cs[u].back() != c)
                    sum += stree[u];
            if(c != cs[v].back())
                sum += n - stree[v];
            fsum += sum*(sum-1);
        }
        cc[c] = fsum;
    }
    ll ans = 0;
    for(int v : vec)
    {
        ans += (n-1)*(n-2);
        ll fsum = 0;
        for(int c : cs[v])
        {
            ll sum = 1;
            for(int u : A[v])
                if(p[u] == v && cs[u].back() != c)
                    sum += stree[u];
            if(c != cs[v].back())
                sum += n - stree[v];
            fsum += cc[c] - sum*(sum-1);
        }
        ans -= fsum;
    }
    return ans;
}

int n, m;

int main()
{
    FAST;
    cin >> n >> m;
    Loop(i,0,m)
    {
        int v, u;
        cin >> v >> u;
        --v; --u;
        A[v].push_back(u);
        A[u].push_back(v);
    }
    ll ans = 0;
    Loop(i,0,n) if(!vis[i]) ans += solve(i);
    /*Loop(i,0,cnt)
    {
        for(int v : vs[i])
            cout << v << ' ';
        cout << '\n';
    }*/
    cout << ans << '\n';
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...