Submission #1292037

#TimeUsernameProblemLanguageResultExecution timeMemory
1292037Hamed_GhaffariDuathlon (APIO18_duathlon)C++20
100 / 100
119 ms36356 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

#define mins(a, b) (a = min(a, b))
#define SZ(x) int(x.size())

const int MXN = 1e5+5;

int n, m;
int h[MXN], low[MXN], timer;
bool cut[MXN], CUT[MXN<<1];
vector<int> g[MXN], stk;
vector<vector<int>> comp;

void bcc(int v, int p=0) {
    low[v] = h[v] = ++timer;
    stk.push_back(v);
    for(int u : g[v]) if(u!=p) {
        if(h[u]) mins(low[v], h[u]);
        else {
            bcc(u, v);
            mins(low[v], low[u]);
            if(low[u]>=h[v]) {
                cut[v] |= h[v]>1 || h[u]>2;
                comp.push_back({v});
                while(comp.back().back()!=u) {
                    comp.back().push_back(stk.back());
                    stk.pop_back();
                }
            }
        }
    }
}

int N, id[MXN], cnt[MXN<<1];
vector<int> G[MXN<<1];

void block_cut_tree() {
    for(int i=1; i<=n; i++) {
        if(!h[i]) {
            bcc(i);
            if(g[i].empty()) {
                comp.push_back({i});
                stk.pop_back();
            }
        }
        if(cut[i]) {
            cnt[id[i]=++N]++;
            CUT[N] = 1;
        }
    }
    for(auto &cmp : comp) {
        N++;
        for(int v : cmp)
            if(cut[v])
                G[id[v]].push_back(N),
                G[N].push_back(id[v]);
            else cnt[id[v]=N]++;
    }
}

int sz[MXN<<1], par[MXN<<1];
vector<int> vec;
bool vis[MXN<<1];

void dfs(int v) {
    vec.push_back(v);
    vis[v] = 1;
    sz[v] = cnt[v];
    for(int u : G[v])
        if(!vis[u])
            par[u] = v,
            dfs(u),
            sz[v] += sz[u];
}

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n >> m;
    for(int i=1,u,v; i<=m; i++) {
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    block_cut_tree();
    ll ans = 0;
    for(int i=1; i<=N; i++)
        if(!vis[i]) {
            dfs(i);
            ans += 1ll*sz[i]*(sz[i]-1)*(sz[i]-2);
            for(int v : vec) if(!CUT[v]) {
                ll c = cnt[v] + SZ(G[v])-1;
                ans -= 1ll*c*(sz[i]-sz[v])*(sz[i]-sz[v]-1);
                for(int u : G[v]) if(u!=par[v])
                    ans -= 1ll*c*sz[u]*(sz[u]-1);
            }
            vec.clear();
        }
    cout << ans << '\n';
    return 0;
}
#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...