Submission #973894

#TimeUsernameProblemLanguageResultExecution timeMemory
973894dubabuba철인 이종 경기 (APIO18_duathlon)C++14
23 / 100
95 ms22352 KiB
#include <bits/stdc++.h> using namespace std; #define int long long typedef long long i64; typedef pair<int, int> pii; #define ff first #define ss second #define MP make_pair const int mxn = 2e5 + 10; vector<int> adj[mxn]; vector<pii> edges; i64 kv_sum[mxn]; int col[mxn]; i64 sum_kv[mxn]; int chi[mxn]; int n, m; int colour(int u) { if(col[u] < 0) return u; return col[u] = colour(col[u]); } bool unite(int u, int v) { u = colour(u); v = colour(v); if(u == v) return 0; if(col[u] > col[v]) swap(u, v); col[u] += col[v]; col[v] = u; return 1; } bool vis[mxn]; i64 ans = 0; void dfs(int u, int par) { vis[u] = 1; for(int v : adj[u]) { if(v == par) continue; if(vis[v]) continue; dfs(v, u); chi[u] += chi[v]; kv_sum[u] += chi[v] * chi[v]; sum_kv[u] += chi[v]; } sum_kv[u] *= sum_kv[u]; chi[u]++; i64 t = sum_kv[u] - kv_sum[u]; ans += t / 2; i64 total = -col[colour(u)]; i64 s = total - chi[u]; i64 f = chi[u] - 1; ans += s * f; // cout << "node: " << u << endl; // cout << sum_kv[u] * sum_kv } int32_t main() { cin >> n >> m; memset(col, -1, sizeof col); for(int i = 0; i < m; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); unite(u, v); } for(int u = 1; u <= n; u++) if(!vis[u]) dfs(u, u); cout << 2 * ans << endl; 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...