제출 #924345

#제출 시각아이디문제언어결과실행 시간메모리
924345codefox철인 이종 경기 (APIO18_duathlon)C++14
0 / 100
123 ms41356 KiB
#include<bits/stdc++.h> using namespace std; #define int ll #define ll long long vector<vector<int>> graph; vector<vector<int>> cgraph; vector<int> comp; vector<int> art; vector<int> low; vector<int> num; vector<int> vis; stack<int> s; int c = 0; int d = 0; int root = 0; int sub = 0; vector<int> subtree; vector<ll> compsize; ll sol = 0; ll n, m; void dfs(int i, int p) { num[i] = low[i] = ++c; s.push(i); for (int ele:graph[i]) { if (i==root) sub++; if (ele == p) continue; if (!num[ele]) { dfs(ele, i); if (low[ele]>=num[i]) art[i] = 1; if (low[ele]==num[i]) { while(s.top() != i) { comp[s.top()] = d; compsize[d]++; s.pop(); } comp[i] = d; compsize[d]++; s.pop(); d++; } } low[i] = min(low[i], low[ele]); } if (num[i]==low[i] && comp[i]==-1) { art[i] = 1; while (s.top() != i) { comp[s.top()] = d; compsize[d]++; s.pop(); } comp[i] = d; compsize[d]++; s.pop(); d++; } } int dfs2(int i) { vis[i] = 1; ll ss = 0; vector<int> cs; for (int ele:cgraph[i]) { if (!vis[ele]) { int h = dfs2(ele); sol -= compsize[i]*(h-compsize[ele])*(h-compsize[ele]-1); sol -= compsize[i]*compsize[ele]*(h-compsize[ele])*2; cs.push_back(ele); ss+=h; } } for (int ele:cs) { sol -= compsize[ele]*(sub-ss-compsize[i])*(sub-ss-compsize[i]-1); sol -= compsize[ele]*compsize[i]*(sub-ss-compsize[i])*2; } return ss+compsize[i]; } int32_t main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); cin >> n >> m; graph.assign(n, vector<int>()); cgraph.assign(5*n, vector<int>()); compsize.assign(5*n, 0); low.assign(n, 0); num.assign(n, 0); comp.assign(n, -1); art.assign(n, 0); vis.assign(5*n, 0); subtree.assign(5*n, 0); for (int i =0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; graph[a].push_back(b); graph[b].push_back(a); } for (int i = 0; i < n; i++) { if (!num[i]) { sub = 0; root = i; c = 0; dfs(i, -1); subtree[comp[i]] = c; sol += max((ll)0, c*(c-1)*(c-2)); if (sub==1) art[i] = 0; } } for (int i = 0; i <n; i++) { if (art[i]) { compsize[comp[i]]--; comp[i] = d; subtree[d] = subtree[comp[i]]; subtree[comp[i]]=0; compsize[d] = 1; d++; } } for (int i = 0; i <n; i++) { if (art[i]) { for (int ele:graph[i]) { if (art[ele] && ele > i) { cgraph[comp[i]].push_back(d); cgraph[d].push_back(comp[i]); cgraph[d].push_back(comp[ele]); cgraph[comp[ele]].push_back(d); d++; continue; } cgraph[comp[i]].push_back(comp[ele]); cgraph[comp[ele]].push_back(comp[i]); } } } for (int i = 0; i < n; i++) { if (!vis[comp[i]]) { sub = subtree[comp[i]]; dfs2(comp[i]); } } cout << sol << "\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...