Submission #203526

#TimeUsernameProblemLanguageResultExecution timeMemory
203526Kevin_Zhang_TW철인 이종 경기 (APIO18_duathlon)C++17
8 / 100
158 ms57460 KiB
#include<bits/stdc++.h> #define pb emplace_back using namespace std; using ll = long long; const int maxn = 300010; int n, m; vector<int> edge[maxn]; int low[maxn], st[maxn], stl, dep[maxn]; int cnt_b; ll gsz; vector<int> c[maxn<<1]; bool is_ap[maxn]; ll res; int h; #define c2(i) ((ll)(i) * ((ll)(i)-1) / 2) #define p3(i) ((ll)(i) * ((ll)(i)-1) * ((ll)(i)-2)) vector<int> tree_edge[maxn<<1]; int sz[maxn<<1]; void dfs2(int now, int last = 0){ sz[now] = c[now].size(); for (int u : tree_edge[now]) if(u != last) { dfs2(u, now); sz[now] += sz[u] - (now > n); } //if (now > n) { // assert(c[now].size() > 1); // cout << "now " << now << ' ' << "sz " << sz[now] << ' ' << "apc " << apc << '\n'; // ll cur = c[now].size()-apc; // res += cur * (c[now].size()-1) * (gsz-c[now].size()); // auto add = [&](ll a, ll b, ll all){ // cout << a << ' ' << b << ' ' << all-b << '\n'; // res += a * b * (all-b); // }; // for (int u : tree_edge[now]) if(u != last) { // add(cur, sz[u]-1, gsz); // } // add(c[now].size()-apc, gsz-sz[now], gsz); // res += p3(cur); //} if (now > n){ ll apc = 0; //cout << "now "; for (int u : c[now]) apc += is_ap[u];//, cout << u << ' '; //cout << '\n'; //cout << "sz " << sz[now] << '\n'; ll ore = res; auto add = [&](ll a_with_ap, ll b_with_ap, ll all) { //cout << a_with_ap << ' ' << b_with_ap << ' ' << all << '\n'; //cout << (a_with_ap - apc) * (b_with_ap) * (a_with_ap - apc - 1) << '\n'; res += (a_with_ap - apc) * (b_with_ap) * (a_with_ap - apc - 1) * 2; //cout << b_with_ap << ' ' << all - a_with_ap - b_with_ap + 1 << ' ' << a_with_ap - apc << '\n'; // if (false) // cout << "Y " << (b_with_ap) * (all - a_with_ap - b_with_ap + 1) * (a_with_ap - apc) << '\n'; res += (b_with_ap) * (all - a_with_ap - b_with_ap + 1) * (a_with_ap - apc); }; for (int u : tree_edge[now]) if(u != last) { add(c[now].size(), sz[u], gsz); } if (last) add(c[now].size(), gsz - sz[now]+1, gsz); res += p3(c[now].size()); //res += (ll)(c[now].size()-1) * (ll)(c[now].size()-2) * apc; //cout << "all add " << res - ore << '\n'; } else { auto add = [&](ll a, ll all){ res += (a-1) * (all-a); }; for (int u : tree_edge[now]) if(u != last){ add(sz[u], gsz); } if (last) add(gsz - sz[now]+1, gsz); } } void cal(){ for (int i = h;i < cnt_b;++i){ for (int u : c[i]) if (is_ap[u]) { tree_edge[u].pb(i); tree_edge[i].pb(u); } } dfs2(h); } void dfs(int now, int last = 0){ static int d; if (last == 0) { gsz = 0; h = cnt_b; } ++gsz; low[now] = dep[now] = ++d; st[stl++] = now; int cnt_c = 0; for (int u : edge[now]) if (u != last) { if (!low[u]){ dfs(u, now); ++cnt_c; low[now] = min(low[now], low[u]); if (low[u] >= dep[now]){ do { c[cnt_b].pb( st[--stl] ); } while (st[stl] != u); c[cnt_b++].pb(now); is_ap[now] = true; } } else low[now] = min(low[now], dep[u]); } if (last == 0 && cnt_c < 2) is_ap[now] = false; --d; if (last == 0) cal(); } signed main(){ ios_base::sync_with_stdio(0), cin.tie(0); cin >> n >> m; for ( int a, b, i = 0 ; i < m ; ++i) { cin >> a >> b; edge[a].pb(b); edge[b].pb(a); } cnt_b = n+1; for (int i = 1;i <= n;++i) if (!low[i]) dfs(i); cout << res << '\n'; }

Compilation message (stderr)

count_triplets.cpp: In function 'void dfs2(int, int)':
count_triplets.cpp:47:5: warning: unused variable 'ore' [-Wunused-variable]
  ll ore = res; 
     ^~~
#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...