Submission #372257

#TimeUsernameProblemLanguageResultExecution timeMemory
372257nandonathanielDuathlon (APIO18_duathlon)C++14
100 / 100
154 ms28268 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=100005; int node,cntbcc,n,tmp,low[MAXN],disc[MAXN],subtree[2*MAXN]; long long ans; stack<int> S; vector<int> adj[MAXN]; vector<int> adjbct[2*MAXN]; void dfs(int now,int par){ tmp++; disc[now]=low[now]=tmp; S.push(now); node++; for(auto nxt : adj[now]){ if(nxt==par)continue; if(disc[nxt]!=0)low[now]=min(low[now],disc[nxt]); else{ dfs(nxt,now); low[now]=min(low[now],low[nxt]); if(low[nxt]>=disc[now]){ cntbcc++; adjbct[now].push_back(n+cntbcc); while(adjbct[n+cntbcc].empty() || adjbct[n+cntbcc].back()!=nxt){ adjbct[n+cntbcc].push_back(S.top()); S.pop(); } } } } } void dfsAns(int now){ if(now<=n)subtree[now]=1; else subtree[now]=0; for(auto nxt : adjbct[now]){ dfsAns(nxt); subtree[now]+=subtree[nxt]; if(now>n){ ans-=1LL*adjbct[now].size()*subtree[nxt]*(subtree[nxt]-1); } } if(now>n){ ans-=1LL*adjbct[now].size()*(node-subtree[now])*(node-subtree[now]-1); } } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int m,u,v; cin >> n >> m; for(int i=1;i<=m;i++){ cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } for(int i=1;i<=n;i++){ if(!disc[i]){ node=0; dfs(i,0); ans+=1LL*node*(node-1)*(node-2); dfsAns(i); } } 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...