Submission #440036

#TimeUsernameProblemLanguageResultExecution timeMemory
440036KULIKOLDDuathlon (APIO18_duathlon)C++17
31 / 100
180 ms22212 KiB
//#pragma GCC optimize ("O3")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
const int DIM = 1E5+7;
const int INF = 1E9;
vector<int> G[DIM],NG[DIM];
int tmin[DIM],tin[DIM],timer = 0,ptr = 0,P[DIM],vis[DIM],sub[DIM];
ll dp[DIM];
int F(int x){
    return x==P[x]?x:P[x] = F(P[x]);
}
void unite(int a,int b){
    a = F(a);
    b = F(b);
    P[a] = b;
}
int fcmp(int v,int par){
    tin[v] = tmin[v] = ++timer;
    for(auto to:G[v]){
        if (to==par)
            continue;
        if (tin[to]==0) {
            fcmp(to,v);
            if (tmin[to]<=tin[v])
                unite(to,v);
            tmin[v] = min(tmin[to],tmin[v]);
        }
        else
            tmin[v] = min(tin[to],tmin[v]);
    }
    return 1;
}

ll res = 0,ans = 0;
vector<int> V[DIM];
void dfs(int v){
    vis[v] = 1;
    int sz = int(V[v].size());
    dp[v] = ll(sz-1)*(sz-2) + sz - 1;
    ans+=ll(sz)*(sz-1)*(sz-2);
    sub[v] = sz;
    for(int ver:V[v]){
        int su = 0;
        for(int vto:G[ver]){
            int to = F(vto);
            if (to==v || vis[to])
                continue;
            dfs(to);
            res+=dp[to]*sub[v]+dp[v]*sub[to];
            dp[v] = dp[v]+dp[to]+sub[to];
            sub[v]+=sub[to];
            su+=sub[to];
        }
        dp[v]+=ll(sz-1)*su;
    }
    /*for(auto to:G[v]){
        if (vis[to])
            continue;
        dfs(to);
        res+=dp[to]*sub[v]+dp[v]*sub[to];
        dp[v] = dp[v]+dp[to]+sz*sub[to];
        sub[v]+=sub[to];
    }*/
}
int solve(){
    int n,m;
    cin>>n>>m;
    for(int i = 1;i<=n;++i)
        P[i] = i;
    for(int i = 1;i<=m;++i){
        ll u,v;
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    for(int i = 1;i<=n;++i){
        if (!tin[i]) {
            fcmp(i, i);
        }
    }
    for(int i = 1;i<=n;++i){
        V[F(i)].push_back(i);
    }
    for(int i = 1;i<=n;++i){
        if (!V[i].empty() && !vis[i])
            dfs(i);
    }
    cout<<res*2+ans<<endl;
    return 1;
}
int main() {

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
    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...