Submission #742879

#TimeUsernameProblemLanguageResultExecution timeMemory
742879PixelCatDuathlon (APIO18_duathlon)C++14
66 / 100
105 ms40144 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 par[MAXN]; int dep[MAXN]; int id[MAXN]; vector<pii> bcc[MAXN]; int siz[MAXN]; int sum[MAXN]; int cur_bcc = 0; void dfs_bcc(int n, int p, int d) { par[n] = p; dep[n] = d; for(auto &i:adj[n]) if(i != p) { if(!par[i]) { // tree edge dfs_bcc(i, n, d + 1); } else if(dep[i] < dep[n]) { // back edge cur_bcc++; int t = n; while(true) { id[t] = cur_bcc; if(t == i) break; t = par[t]; } } } if(!id[n]) id[n] = ++cur_bcc; for(auto &i:adj[n]) if(dep[i] > dep[n] && id[i] != id[n]) { bcc[id[i]].eb(i, id[n]); bcc[id[n]].eb(n, id[i]); } siz[id[n]]++; } void dfs_siz(int n, int p) { sum[n] = siz[n]; // assert(siz[n] == 1); for(auto &i:bcc[n]) if(i.S != p) { dfs_siz(i.S, n); sum[n] += sum[i.S]; } } int ans; #define C(x) ((x) * ((x) - 1)) void dfs_ans(int n, int p, int tot_n) { int t = C(tot_n - 1) * siz[n]; int t1 = t; map<int, int> mp; for(auto &i:bcc[n]) { if(!mp.count(i.F)) mp[i.F] = 0; int s = sum[i.S]; if(i.S == p) s = tot_n - sum[n]; mp[i.F] += s; t -= C(s); if(i.S != p) dfs_ans(i.S, n, tot_n); } for(auto &i:mp) { int k = i.S; // cout << "! " << i.F << " " << i.S << '\n'; t -= C(k + 1) * (siz[n] - 1); } // cout << t1 << " " << t << "\n"; ans += t; } 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); } ans = 0; For(i, 1, n) if(!par[i]) { For(j, 1, cur_bcc) { bcc[j].clear(); siz[j] = 0; } cur_bcc = 0; dfs_bcc(i, i, 1); dfs_siz(1, 1); dfs_ans(1, 1, sum[1]); // cout << cur_bcc << "\n"; // For(j, 1, cur_bcc) { // cout << j << " = " << siz[j] << ", " << sum[j] << ":"; // for(auto &k:bcc[j]) cout << " " << k; // cout << "\n"; // } // cout << flush; } cout << ans << "\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 */

Compilation message (stderr)

count_triplets.cpp: In function 'void dfs_ans(LL, LL, LL)':
count_triplets.cpp:65:9: warning: unused variable 't1' [-Wunused-variable]
   65 |     int t1 = t;
      |         ^~
#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...