Submission #737041

#TimeUsernameProblemLanguageResultExecution timeMemory
737041onlk97Duathlon (APIO18_duathlon)C++14
0 / 100
170 ms32984 KiB
#include <bits/stdc++.h> using namespace std; long long n,m; vector <int> g[100010],bc[200010]; bool visited[200010]; long long dfn[100010],lo[100010],w[200020],sz[200020],occ[200020]; stack <int> st; int tme,curid; void dfs(int cur){ tme++; dfn[cur]=lo[cur]=tme; visited[cur]=1; st.push(cur); for (int i:g[cur]){ if (!visited[i]){ dfs(i); lo[cur]=min(lo[cur],lo[i]); if (lo[i]==dfn[cur]){ curid++; bool ok=1; while (ok){ bc[st.top()].push_back(curid); bc[curid].push_back(st.top()); w[curid]++; if (st.top()==i) ok=0; st.pop(); } bc[cur].push_back(curid); bc[curid].push_back(cur); w[curid]++; } } else lo[cur]=min(lo[cur],dfn[i]); } } void dfs2(int cur,int prv){ visited[cur]=1; sz[cur]=(cur<=n); long long rem=n-(cur<=n); occ[cur]=n*(n-1)/2; for (int i:bc[cur]){ if (i==prv) continue; dfs2(i,cur); sz[cur]+=sz[i]; occ[cur]-=sz[i]*(sz[i]-1)/2; rem-=sz[i]; } occ[cur]-=rem*(rem-1)/2; } signed main(){ cin>>n>>m; for (int i=0; i<m; i++){ int u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } curid=n; for (int i=1; i<=n; i++){ if (!visited[i]) dfs(i); } for (int i=1; i<=curid; i++) visited[i]=0; for (int i=1; i<=n; i++) w[i]=-1; for (int i=1; i<=curid; i++){ if (!visited[i]) dfs2(i,0); } long long ans=0; for (int i=1; i<=curid; i++) ans+=w[i]*occ[i]; cout<<ans*2<<'\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...