제출 #265469

#제출 시각아이디문제언어결과실행 시간메모리
265469DS007철인 이종 경기 (APIO18_duathlon)C++14
31 / 100
406 ms68984 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 1e5, M = 2e5; vector<int> adj[N], tree[N]; bool explored[N], up[N], down[N]; int n, m, dp[N][3], ans, cid[N], cnt[N], dep[N], sz[N], comp[N], compno; set<pair<int, int>> br; void dfs2(int v, int p = -1) { if (sz[v] == 0) return; explored[v] = true; int s1 = 0, s2 = 0; dp[v][0] = sz[v]; dp[v][1] = sz[v] * (sz[v] - 1) - (sz[v] - 1); dp[v][2] = sz[v] * (sz[v] - 1) * (sz[v] - 2); for (int i : tree[v]) { if (i != p) { dfs2(i, v); dp[v][0] += dp[i][0]; dp[v][1] += dp[i][0] * sz[v] + dp[i][1]; dp[v][2] += dp[i][1] * sz[v] * 2 + (sz[v] * (sz[v] - 1) - (sz[v] - 1)) * dp[i][0] * 2; s2 += dp[i][1]; s1 += dp[i][0]; } } for (int i : tree[v]) { if (i != p) { s2 -= dp[i][1]; s1 -= dp[i][0]; dp[v][2] += s2 * dp[i][0] * 2; dp[v][2] += s1 * dp[i][0]; s2 += dp[i][1]; s1 += dp[i][0]; } } ans += dp[v][2]; } void dfs1(int v) { int curcmp = compno; comp[v] = curcmp; queue<int> q; q.push(v); explored[v] = true; while (!q.empty()) { int u = q.front(); sz[curcmp]++; q.pop(); for (int i : adj[u]) { if (explored[i]) continue; if (br.count({u, i})) { compno++; tree[curcmp].push_back(compno); tree[compno].push_back(curcmp); dfs1(i); } else { q.push(i); explored[i] = true; } } } } void dfs(int v, int p = -1, int d = 0) { explored[v] = true; dep[v] = d; for (int i : adj[v]) { if (!explored[i]) dfs(i, v, d + 1), cnt[v] += cnt[i]; else if (i != p && dep[i] < dep[v]) cnt[v]++; else if (i != p) cnt[v]--; } if (cnt[v] == 0 && p != -1) br.insert({p, v}), br.insert({v, p}); } int solveTestCase() { cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; u--, v--; adj[u].push_back(v); adj[v].push_back(u); } for (int i = 0; i < n; i++) { if (!explored[i]) dfs(i); //cerr << cnt[i] << " "; } //cerr << "\n"; //assert(br.size() == m * 2); //for (auto i : br) // cerr << i.first << " " << i.second << "\n"; fill(explored, explored + n, false); for (int i = 0; i < n; i++) { if (!explored[i]) dfs1(i), compno++; //cerr << comp[i] << " " << sz[comp[i]] << "\n"; } //for (int i = 0; i < n; i++) // assert(sz[i] == 1); fill(explored, explored + n, false); assert(compno <= n); for (int i = 0; i < compno; i++) { if (!explored[i]) dfs2(i); assert(sz[i]); //cerr << dp[i][0] << " " << dp[i][1] << " " << dp[i][2] << endl; } cout << ans; return 0; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int t = 1; //cin >> t; while (t--) solveTestCase(); }
#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...