제출 #829646

#제출 시각아이디문제언어결과실행 시간메모리
829646FatihSolak철인 이종 경기 (APIO18_duathlon)C++17
31 / 100
77 ms27376 KiB
#include <bits/stdc++.h> #define N 100005 using namespace std; vector<int> adj[N]; vector<int> adj2[N]; vector<int> adj3[N]; int d[N]; int low[N]; vector<pair<int,int>> edges; int totsize[N]; int val = 0; void dfs(int v,int par){ d[v] = d[par] + 1; low[v] = d[v]; totsize[v] = 1; for(auto u:adj[v]){ if(u == par) continue; if(d[u] != 0){ low[v] = min(d[u],low[v]); if(d[v] < d[u]){ adj2[v].push_back(u); adj2[u].push_back(v); } } else{ dfs(u,v); totsize[v] += totsize[u]; low[v] = min(low[v],low[u]); if(low[u] <= d[v]){ adj2[v].push_back(u); adj2[u].push_back(v); } else{ edges.push_back({u,v}); } } } } int cnt[N]; int group[N]; int sub[N]; int n; long long ans = 0; void dfs2(int v){ cnt[group[v]]++; for(auto u:adj2[v]){ if(group[u])continue; group[u] = group[v]; dfs2(u); } } void dfs3(int v,int par){ sub[v] = cnt[v]; for(auto u:adj3[v]){ if(u == par) continue; dfs3(u,v); sub[v] += sub[u]; } ans += 2 * (long long)cnt[v] * (cnt[v] - 1) * (val - cnt[v]); ans -= 2 * (long long)(cnt[v] - 1) * (val - cnt[v]); for(auto u:adj3[v]){ if(u == par){ ans += (long long)cnt[v] * (val - sub[v]) * (sub[v] - cnt[v]); } else{ ans += (long long)cnt[v] * (val - sub[u] - cnt[v]) * (sub[u]); } } } void solve(){ int m; cin >> n >> m; for(int i = 1;i<=m;i++){ int u,v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } for(int i = 1;i<=n;i++){ if(d[i] == 0) dfs(i,0); } for(int i = 1;i<=n;i++){ if(group[i] == 0){ group[i] = i; dfs2(i); ans += (long long)cnt[i] * (cnt[i]-1) * (cnt[i]-2); } } for(auto u:edges){ adj3[group[u.first]].push_back(group[u.second]); adj3[group[u.second]].push_back(group[u.first]); } for(int i = 1;i<=n;i++){ if(sub[i] == 0 && group[i] == i){ val = totsize[i]; dfs3(i,0); } } cout << ans; } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); #ifdef Local freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int t = 1; //cin >> t; while(t--){ solve(); } }
#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...