Submission #1335276

#TimeUsernameProblemLanguageResultExecution timeMemory
1335276aaaaaaaaDuathlon (APIO18_duathlon)C++20
23 / 100
1125 ms1114112 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];

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);
    szz[u] += szz[v], parent[v] = u;
}

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

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;
}

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) dfs(i, 0);

    cout << (long long) ans * 2 << "\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...