Submission #742894

#TimeUsernameProblemLanguageResultExecution timeMemory
742894PixelCatDuathlon (APIO18_duathlon)C++14
31 / 100
148 ms33160 KiB
#include <bits/stdc++.h> #define For(i, a, b) for(int i = a; i <= b; i++) #define Forr(i, a, b) for(int i = a; i >= b; i--) #define F first #define S second #define eb emplace_back #define all(x) x.begin(), x.end() #define sz(x) ((int)x.size()) #define int LL using namespace std; using LL = long long; using pii = pair<int, int>; const int MAXN = 100010; vector<int> adj[MAXN]; int dep[MAXN]; int lo[MAXN]; int id[MAXN]; vector<int> bcc[MAXN * 2]; int siz[MAXN * 2]; int sum[MAXN * 2]; int ban[MAXN * 2]; int cur_bcc = 0; vector<int> st; void dfs_bcc(int n, int p, int d) { dep[n] = lo[n] = d; st.eb(n); for(auto &i:adj[n]) if(i != p) { if(dep[i]) { lo[n] = min(lo[n], dep[i]); } else { dfs_bcc(i, n, d + 1); lo[n] = min(lo[n], lo[i]); if(lo[i] >= dep[n]) { // bcc found cur_bcc++; int last = 0; while(last != n) { last = st.back(); st.pop_back(); bcc[last].eb(cur_bcc); bcc[cur_bcc].eb(last); } st.eb(n); } } } } void dfs_siz(int n, int p, int N) { sum[n] = siz[n] = (n <= N); for(auto &i:bcc[n]) if(i != p) { dfs_siz(i, n, N); sum[n] += sum[i]; } } #define C(x) ((x) * ((x) - 1)) void dfs_ban(int n, int p, int N, int tot) { auto size = [&](int r, int k) { if(sum[k] > sum[r]) return tot - sum[r]; return sum[k]; }; for(auto &i:bcc[n]) if(i != p) { dfs_ban(i, n, N, tot); } if(n > N) { for(auto &i:bcc[n]) { ban[n] += C(size(n, i)); ban[i] -= C(size(n, i)); } for(auto &i:bcc[n]) { ban[i] += ban[n]; } } } int ans = 0; void dfs_ans(int n, int p, int N, int tot) { if(n <= N) ans += C(tot - 1) - ban[n]; for(auto &i:bcc[n]) if(i != p) dfs_ans(i, n, N, tot); } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); // =^-w-^= nya int n, m; cin >> n >> m; while(m--) { int a, b; cin >> a >> b; adj[a].eb(b); adj[b].eb(a); } cur_bcc = n; For(i, 1, n) if(!dep[i]) { dfs_bcc(i, i, 1); dfs_siz(i, i, n); dfs_ban(i, i, n, sum[i]); dfs_ans(i, i, n, sum[i]); } cout << ans << "\n"; // For(i, 1, n) cout << ban[i] << " \n"[i == n]; // For(i, 1, cur_bcc) { // cout << i << ":"; // for(auto &j:bcc[i]) cout << " " << j; // cout << "\n"; // } return 0; } /* 4 3 1 2 2 3 3 4 = 8 4 4 1 2 2 3 3 4 4 2 = 14 5 5 1 2 2 3 3 1 3 4 3 5 = 24 5 6 1 2 2 3 3 1 1 4 4 5 5 1 = 36 */
#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...