Submission #979156

#TimeUsernameProblemLanguageResultExecution timeMemory
979156huutuanDuathlon (APIO18_duathlon)C++14
100 / 100
131 ms71580 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int N=3e5+10; int n, m; vector<int> g[N]; int num[N], low[N], tdfs; stack<pair<int, int>> stk; vector<pair<int, int>> bcc[N]; int cnt=0, cc[N], sz[N]; bool joint[N]; vector<int> gg[N]; void dfs_joint(int u, int p){ num[u]=low[u]=++tdfs; int child=0; for (int v:g[u]){ if (v==p) continue; if (!num[v]){ ++child; stk.emplace(u, v); dfs_joint(v, u); low[u]=min(low[u], low[v]); if (low[v]>=num[u]){ joint[u]=1; ++cnt; pair<int, int> edge={-1, -1}; do{ edge=stk.top(); stk.pop(); bcc[cnt].emplace_back(edge); }while (edge!=make_pair(u, v)); } }else low[u]=min(low[u], num[v]); } if (!p) joint[u]=child>=2; } int ans; int sub_sz[N], sum[N]; void dfs_sz(int u, int p){ sub_sz[u]=sz[u]; for (int v:gg[u]) if (v!=p) dfs_sz(v, u), sub_sz[u]+=sub_sz[v]; } int tot; void dfs(int u, int p){ if (u>n){ for (int v:gg[u]){ int size=sub_sz[v]; if (v==p) size=tot-sub_sz[u]; ans-=size*(size-1)*sz[u]; sum[u]+=size*(size-1); } } for (int v:gg[u]) if (v!=p) dfs(v, u); } void dfs2(int u, int p){ if (u<=n){ for (int v:gg[u]){ ans-=sum[v]; int size=tot-sub_sz[v]; if (v==p) size=sub_sz[u]; ans+=size*(size-1); } } for (int v:gg[u]) if (v!=p) dfs2(v, u); } int32_t main(){ // freopen("duathlon.inp", "r", stdin); ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i=1; i<=m; ++i){ int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } for (int i=1; i<=n; ++i) if (!num[i]){ dfs_joint(i, 0); } set<pair<int, int>> edge; for (int i=1; i<=n; ++i) if (joint[i]) cc[i]=i; for (int i=1; i<=cnt; ++i){ for (auto &j:bcc[i]){ if (!joint[j.first]) cc[j.first]=n+i; else edge.emplace(n+i, j.first); if (!joint[j.second]) cc[j.second]=n+i; else edge.emplace(n+i, j.second); } } for (int i=1; i<=n; ++i) ++sz[cc[i]]; for (auto &i:edge){ gg[i.first].push_back(i.second); gg[i.second].push_back(i.first); } for (int i=1; i<=cnt; ++i){ if (!sub_sz[n+i]){ dfs_sz(n+i, 0); tot=sub_sz[n+i]; ans+=tot*(tot-1)*(tot-2); dfs(n+i, 0); dfs2(n+i, 0); } } 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...