Submission #1173560

#TimeUsernameProblemLanguageResultExecution timeMemory
1173560escobrandDuathlon (APIO18_duathlon)C++20
100 / 100
86 ms35724 KiB
#include <bits/stdc++.h> using namespace std; #define all(v) v.begin(),v.end() #define eb emplace_back #define ll long long #define fi first #define se second int t,n,i,m,j,u,v,co; const int maxn = 3e5 + 10; vector<int> a[maxn],tree[maxn]; int tim[maxn],low[maxn],s[maxn]; stack<int> st; ll ans,N; void dfs(int i,int p) { // cout<<i<<'\n'; N++; tim[i] = low[i] = ++t; st.push(i); for(int k : a[i]) { if(k == p)continue; if(tim[k])low[i] = min(low[i],tim[k]); else { dfs(k,i); low[i] = min(low[i],low[k]); if(low[k] >= tim[i]) { co++; tree[i].eb(n+co); while(st.top() != k) { tree[n+co].eb(st.top()); st.pop(); } tree[n+co].eb(st.top()); st.pop(); } } } } void cal(int i,int p) { s[i] = (i <= n); for(int k : tree[i]) { if(k == p)continue; cal(k,i); s[i] += s[k]; if(i > n)ans -= tree[i].size() * s[k] * (s[k]-1); } if(i > n)ans -= tree[i].size() * (N - s[i]) * (N - s[i] - 1); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; while(m--) { cin>>u>>v; a[u].eb(v); a[v].eb(u); } for(i = 1;i<=n;i++) { if(!tim[i]) { N = 0; dfs(i,0); ans += N * (N - 1) * (N - 2); // cout<<i<<' '<<ans<<'\n'; cal(i,0); } } cout<<ans; 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...