Submission #265442

#TimeUsernameProblemLanguageResultExecution timeMemory
265442DS007Duathlon (APIO18_duathlon)C++14
0 / 100
1087 ms42360 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 1e5, M = 2e5; vector<int> adj[N], tree[N]; bool explored[N], up[N], down[N]; int n, m, dp[N][3], ans, cid[N], cnt[N], dep[N], sz[N], comp[N], compno; set<pair<int, int>> br; void dfs2(int v, int p = -1) { if (sz[v] == 0) return; explored[v] = true; int s1 = 0, s2 = 0; dp[v][0] = sz[v]; dp[v][1] = sz[v] * (sz[v] - 1) - (sz[v] - 1); dp[v][2] = sz[v] * (sz[v] - 1) * (sz[v] - 2); for (int i : tree[v]) { if (i != p) { dfs2(i, v); dp[v][0] += dp[i][0]; dp[v][1] += dp[i][0] * sz[v] + dp[i][1]; dp[v][2] += dp[i][1] * sz[v] * 2 + (sz[v] * (sz[v] - 1) - (sz[v] - 1)) * dp[i][1] * 2; s2 += dp[i][1]; s1 += dp[i][0]; } } for (int i : tree[v]) { if (i != p) { s2 -= dp[i][1]; s1 -= dp[i][0]; dp[v][2] += s2 * dp[i][0] * 2; dp[v][2] += s1 * dp[i][0]; s2 += dp[i][1]; s1 += dp[i][0]; } } ans += dp[v][2]; } void dfs1(int v) { int curcmp = compno; comp[v] = curcmp; queue<int> q; q.push(v); explored[v] = true; while (!q.empty()) { int u = q.front(); sz[curcmp]++; q.pop(); for (int i : adj[u]) { if (explored[i]) continue; if (br.count({u, i}) + br.count({i, u})) { compno++; tree[curcmp].push_back(compno); tree[compno].push_back(curcmp); dfs1(i); } else { q.push(i); explored[i] = true; } } } } void dfs(int v, int p = -1, int d = 0) { explored[v] = true; dep[v] = d; for (int i : adj[v]) { if (!explored[i]) dfs(i, v, d + 1), cnt[v] += cnt[i]; else if (i != p && dep[i] < dep[v]) cnt[v]++; else if (i != p) cnt[v]--; } if (cnt[v] == 0 && p != -1) br.insert({p, v}), br.insert({v, p}); } int solveTestCase() { cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; u--, v--; adj[u].push_back(v); adj[v].push_back(u); } for (int i = 0; i < n; i++) { if (!explored[i]) dfs(i); cerr << cnt[i] << " "; } cerr << "\n"; assert(br.size() == m * 2); for (auto i : br) cerr << i.first << " " << i.second << "\n"; fill(explored, explored + n, false); for (int i = 0; i < n; i++) { if (!explored[i]) dfs1(i); } for (int i = 0; i < n; i++) assert(sz[i] == 1); fill(explored, explored + n, false); for (int i = 0; i < n; i++) { if (!explored[i]) dfs2(i); cerr << dp[i][0] << " " << dp[i][1] << " " << dp[i][2] << endl; } cout << ans; return 0; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int t = 1; //cin >> t; while (t--) solveTestCase(); }

Compilation message (stderr)

In file included from /usr/include/c++/9/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/9/bits/stdc++.h:33,
                 from count_triplets.cpp:1:
count_triplets.cpp: In function 'long long int solveTestCase()':
count_triplets.cpp:109:22: warning: comparison of integer expressions of different signedness: 'std::set<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
  109 |     assert(br.size() == m * 2);
      |            ~~~~~~~~~~^~~~~~~~
#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...