Submission #1335281

#TimeUsernameProblemLanguageResultExecution timeMemory
1335281aaaaaaaaDuathlon (APIO18_duathlon)C++20
8 / 100
54 ms8796 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long

const int mxN = 2e5 + 100;

vector<int> adj[mxN];
int n, m, ans = 0, s[mxN], szz[mxN], parent[mxN], cyc[mxN];

int find(int u){
    if(parent[u] == u) return u;
    return parent[u] = find(parent[u]);
}

void unite(int u, int v){
    u = find(u), v = find(v);
    if(u == v){
        cyc[u] = 1;
    }else{
        cyc[v] |= cyc[u];
        szz[v] += szz[u];
        parent[u] = v;
    }
}

int csz(int u){
    return szz[find(u)];
}

long long answer(int u){
    if(cyc[u]){
        return (long long) szz[find(u)] * (szz[find(u)] - 1) * (szz[find(u)] - 2);
    }else{
        long long cur = 0;
        for(int i = szz[find(u)] - 2; i >= 1; --i){
            cur += (long long) (i * (i + 1)) / 2;
        }
        return cur * 2ll;
    }
}

void dfs(int u = 1, int par = 0){
    s[u] = 1;
    int total = 0;
    for(auto it : adj[u]){
        if(it ^ par){
            dfs(it, u);
            ans += total * s[it];
            total += s[it];
        }
    }
    int left = csz(u) - total - 1;
    ans += left * total;
    s[u] += total;
}

/*

(n * (n - 1) / 2) * (n - 2) * 2

n * (n - 1) * (n - 2)

*/

signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(nullptr); cout.tie(nullptr);

    cin >> n >> m;

    for(int i = 1; i <= n; ++i){
        szz[i] = 1, parent[i] = i;
    }

    for(int i = 1, u, v ; i <= m; ++i){
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
        unite(u, v);
    }

    for(int i = 1; i <= n; ++i) if(find(i) == i) ans += answer(i);

    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...