제출 #203574

#제출 시각아이디문제언어결과실행 시간메모리
203574Kevin_Zhang_TW철인 이종 경기 (APIO18_duathlon)C++17
100 / 100
159 ms55928 KiB
#include<bits/stdc++.h> #define pb emplace_back using namespace std; using ll = long long; const int maxn = 300010; int n, m; vector<int> edge[maxn]; int low[maxn], st[maxn], stl, dep[maxn]; int cnt_b; ll gsz; vector<int> c[maxn]; bool is_ap[maxn]; ll res; int h; vector<int> tree_edge[maxn]; int sz[maxn]; void dfs2(int now, int last = 0){ sz[now] = c[now].size() + (now <= n); for (int u : tree_edge[now]) if(u != last) { dfs2(u, now); sz[now] += sz[u] - 1; } ll cur = c[now].size(); if (now > n){ auto add = [&](ll sz){ return sz * cur * (gsz - sz-1) + (cur-1) * (cur-2) * sz; return (sz) * (gsz-sz-1) * (cur) * 2; }; for (int u : tree_edge[now]) if(u != last) res += add(sz[u]-1); if (last) res += add(gsz-sz[now]); res += cur * (cur-1) * (cur-2); } else { //return; for (int u : tree_edge[now]) if(u != last) res -= (sz[u]-1) * (gsz-sz[u]); if (last) res -= (gsz-sz[now]) * (sz[now]-1); } } void cal(){ for (int i = h;i < cnt_b;++i){ for (int u : c[i]) if (is_ap[u]) { tree_edge[u].pb(i); tree_edge[i].pb(u); } } dfs2(h); gsz = 0, h = cnt_b; } void dfs(int now, int last = 0){ static int d; ++gsz; low[now] = dep[now] = ++d; st[stl++] = now; int cnt_c = 0; for (int u : edge[now]) if (u != last) { if (!low[u]){ dfs(u, now); ++cnt_c; low[now] = min(low[now], low[u]); if (low[u] >= dep[now]){ do { c[cnt_b].pb( st[--stl] ); } while (st[stl] != u); c[cnt_b++].pb(now); is_ap[now] = true; } } else low[now] = min(low[now], dep[u]); } if (!last && cnt_c < 2) is_ap[now] = false; --d; if (last == 0) cal(); } signed main(){ ios_base::sync_with_stdio(0), cin.tie(0); cin >> n >> m; for ( int a, b, i = 0 ; i < m ; ++i) { cin >> a >> b; edge[a].pb(b); edge[b].pb(a); } h = cnt_b = n+1; for (int i = 1;i <= n;++i) if (!low[i]) dfs(i); cout << res << '\n'; }
#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...