제출 #911486

#제출 시각아이디문제언어결과실행 시간메모리
911486prairie2022철인 이종 경기 (APIO18_duathlon)C++17
31 / 100
87 ms27220 KiB
#include<bits/stdc++.h> using namespace std; #define fastio cin.tie(0), cout.tie(0), ios::sync_with_stdio(0); typedef long long ll; const int M = 1e5+1; vector<int> e[M]; int dfn[M], dfc; int stk[M], top = -1, num; vector<int> bct[M<<1]; int tarjan(int u){ // return low dfn[u] = ++dfc; stk[++top] = u; int low = dfn[u]; for(const int &v: e[u]){ if(dfn[v]) low = min(low, dfn[v]); else{ int tmp = tarjan(v); if(tmp==dfn[u]){ bct[++num].push_back(u); while(stk[top]!=u) bct[num].push_back(stk[top--]); for(const int &w: bct[num]) bct[w].push_back(num); } else low = min(low, tmp); } } return low; } int n; ll ans = 0; int tree_dp(int u, int p){ ll sum = 0, cnt = (u<=n); for(const int &v : bct[u]){ if(v==p) continue; int tmp = tree_dp(v, u); sum += cnt*tmp; cnt += tmp; } sum += cnt*(dfc-cnt); ans += sum*(u>n?(int)bct[u].size():-1); return cnt; } int main(){ fastio int m; cin >> n >> m; fill(dfn+1, dfn+n+1, 0); num = n; for(; m; m--){ int u, v; cin >> u >> v; e[u].push_back(v); e[v].push_back(u); } for(int i=1; i<=n; i++) if(!dfn[i] && !e[i].empty()){ dfc = 0, tarjan(i), top--; tree_dp(i, 0); } cout << (ans<<1) << '\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...