From 3297a4d470d714b70a2dc436936513c0c5039c11 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Sun, 26 Apr 2026 01:42:30 -0600 Subject: [PATCH 1/7] nit --- library/trees/centroid_decomp.hpp | 16 ++++++++-------- tests/library_checker_aizu_tests/cd_asserts.hpp | 17 ++++++++--------- .../trees/cd_count_paths_per_length.test.cpp | 8 +++----- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/library/trees/centroid_decomp.hpp b/library/trees/centroid_decomp.hpp index f4202918..397c4b14 100644 --- a/library/trees/centroid_decomp.hpp +++ b/library/trees/centroid_decomp.hpp @@ -1,12 +1,12 @@ #pragma once //! @code //! vector> g(n); -//! centroid(g, [&](int cent, int par_cent) {}); +//! vi par = cd(g, [&](int cent) {}); //! @endcode //! @time O(n log n) //! @space O(n) -void centroid(auto& g, auto f) { - vi siz(sz(g)); +vi cd(auto& g, auto f) { + vi p(sz(g), -1), siz(p); auto ctd = [&](auto ctd, int u, int p, int n) -> int { siz[u] = 1; for (int v : g[u]) @@ -16,10 +16,10 @@ void centroid(auto& g, auto f) { } return 2 * siz[u] >= n ? siz[p] = n - siz[u], u : -1; }; - auto dfs = [&](auto dfs, int u, int p, int n) -> void { - f(u = ctd(ctd, u, u, n), p); - for (int v : g[u]) - erase(g[v], u), dfs(dfs, v, u, siz[v]); + auto dfs = [&](auto dfs, int u, int n) -> int { + f(u = ctd(ctd, u, u, n)); + for (int v : g[u]) erase(g[v], u), p[dfs(dfs, v, siz[v])] = u; + return u; }; - dfs(dfs, 0, -1, sz(g)); + return dfs(dfs, 0, sz(g)), p; } diff --git a/tests/library_checker_aizu_tests/cd_asserts.hpp b/tests/library_checker_aizu_tests/cd_asserts.hpp index e3ea02da..3f9609af 100644 --- a/tests/library_checker_aizu_tests/cd_asserts.hpp +++ b/tests/library_checker_aizu_tests/cd_asserts.hpp @@ -3,25 +3,24 @@ void cd_asserts(vector> adj) { vector decomp_size(sz(adj), -1); vector naive_par_decomp(sz(adj), -1); - centroid(adj, [&](int cent, int par_cent) -> void { - assert(naive_par_decomp[cent] == par_cent); + vi par = cd(adj, [&](int cent) -> void { assert(decomp_size[cent] == -1); auto dfs = [&](auto&& self, int u, int p) -> int { - naive_par_decomp[u] = cent; + if (p != -1) naive_par_decomp[u] = cent; int sub_size = 1; for (int v : adj[u]) if (v != p) sub_size += self(self, v, u); return sub_size; }; decomp_size[cent] = dfs(dfs, cent, -1); - if (par_cent != -1) - assert(1 <= decomp_size[cent] && - 2 * decomp_size[cent] <= decomp_size[par_cent]); for (int u : adj[cent]) { int sz_subtree = dfs(dfs, u, cent); - assert(1 <= sz_subtree && - 2 * sz_subtree <= decomp_size[cent]); + assert(1 <= sz_subtree && 2 * sz_subtree <= decomp_size[cent]); } }); - rep(i, 0, sz(adj)) assert(decomp_size[i] >= 1); + assert(par == naive_par_decomp); + rep(i, 0, sz(adj)) { + assert(decomp_size[i] >= 1); + if (par[i] != -1) assert(2 * decomp_size[i] <= decomp_size[par[i]]); + } } diff --git a/tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp b/tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp index ff0ccdf7..b64a3e55 100644 --- a/tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp +++ b/tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp @@ -11,7 +11,7 @@ //! which are each O(n) vector count_paths_per_length(vector adj) { vector num_paths(sz(adj)); - centroid(adj, [&](int cent, int) { + cd(adj, [&](int cent) { vector> child_depths; for (int v : adj[cent]) { child_depths.emplace_back(1, 0.0); @@ -29,15 +29,13 @@ vector count_paths_per_length(vector adj) { swap(q, new_q); } } - sort(all(child_depths), - [&](auto& x, auto& y) { return sz(x) < sz(y); }); + sort(all(child_depths), [&](auto& x, auto& y) { return sz(x) < sz(y); }); vector total_depth(1, 1.0); for (const auto& cnt_depth : child_depths) { auto prod = conv(total_depth, cnt_depth); rep(i, 1, sz(prod)) num_paths[i] += llround(prod[i]); total_depth.resize(sz(cnt_depth)); - rep(i, 1, sz(cnt_depth)) total_depth[i] += - cnt_depth[i]; + rep(i, 1, sz(cnt_depth)) total_depth[i] += cnt_depth[i]; } }); return num_paths; From 225a3077fd6c4d6df9a004ddc1d7b4bf3b7acab8 Mon Sep 17 00:00:00 2001 From: GitHub Date: Sun, 26 Apr 2026 07:46:50 +0000 Subject: [PATCH 2/7] [auto-verifier] verify commit 3297a4d470d714b70a2dc436936513c0c5039c11 --- .verify-helper/timestamps.remote.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index c4b41e64..b5ab4708 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -74,7 +74,6 @@ "tests/library_checker_aizu_tests/graphs/strongly_connected_components_aizu.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/graphs/strongly_connected_components_lib_checker.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/graphs/two_edge_components.test.cpp": "2026-04-12 16:21:27 -0600", -"tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/handmade_tests/dsu.test.cpp": "2026-01-22 10:08:22 -0700", "tests/library_checker_aizu_tests/handmade_tests/edge_cd_small_trees.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/handmade_tests/fib_matrix_expo.test.cpp": "2026-01-28 21:48:16 -0700", @@ -131,7 +130,7 @@ "tests/library_checker_aizu_tests/strings/suffix_array_short.test.cpp": "2026-04-12 06:15:25 -0600", "tests/library_checker_aizu_tests/strings/trie.test.cpp": "2026-01-17 12:38:18 -0700", "tests/library_checker_aizu_tests/strings/wildcard_pattern_matching.test.cpp": "2025-08-05 19:19:23 -0600", -"tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp": "2026-04-12 17:51:15 -0400", +"tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp": "2026-04-26 01:42:30 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_contour_range_query.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_contour_range_update.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_count_paths_per_length.test.cpp": "2026-04-12 16:21:27 -0600", From aa6732ecedbcdf6c0819eb0c09b34bebf4626bec Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Sun, 26 Apr 2026 01:52:59 -0600 Subject: [PATCH 3/7] more golf!!!!!!! --- library/trees/centroid_decomp.hpp | 10 +++++----- .../handmade_tests/count_paths.test.cpp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/library/trees/centroid_decomp.hpp b/library/trees/centroid_decomp.hpp index 397c4b14..9fac10d2 100644 --- a/library/trees/centroid_decomp.hpp +++ b/library/trees/centroid_decomp.hpp @@ -6,7 +6,7 @@ //! @time O(n log n) //! @space O(n) vi cd(auto& g, auto f) { - vi p(sz(g), -1), siz(p); + vi p(sz(g), -1), siz(sz(g), sz(g)); auto ctd = [&](auto ctd, int u, int p, int n) -> int { siz[u] = 1; for (int v : g[u]) @@ -16,10 +16,10 @@ vi cd(auto& g, auto f) { } return 2 * siz[u] >= n ? siz[p] = n - siz[u], u : -1; }; - auto dfs = [&](auto dfs, int u, int n) -> int { - f(u = ctd(ctd, u, u, n)); - for (int v : g[u]) erase(g[v], u), p[dfs(dfs, v, siz[v])] = u; + auto dfs = [&](auto dfs, int u) -> int { + f(u = ctd(ctd, u, u, siz[u])); + for (int v : g[u]) erase(g[v], u), p[dfs(dfs, v)] = u; return u; }; - return dfs(dfs, 0, sz(g)), p; + return dfs(dfs, 0), p; } diff --git a/tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp b/tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp index afa46c2d..d21f741a 100644 --- a/tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp +++ b/tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp @@ -17,7 +17,7 @@ //! which are all O(n) vector count_paths_per_node(vector adj, int k) { vector num_paths(sz(adj)); - centroid(adj, [&](int cent, int) { + cd(adj, [&](int cent) { vector pre_d{1}, cur_d{0}; auto dfs = [&](auto&& self, int u, int p, int d) -> ll { From b8bd506fa781210263925def7cc8e335fa9871f4 Mon Sep 17 00:00:00 2001 From: GitHub Date: Sun, 26 Apr 2026 07:56:26 +0000 Subject: [PATCH 4/7] [auto-verifier] verify commit aa6732ecedbcdf6c0819eb0c09b34bebf4626bec --- .verify-helper/timestamps.remote.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index b5ab4708..341cf321 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -74,6 +74,7 @@ "tests/library_checker_aizu_tests/graphs/strongly_connected_components_aizu.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/graphs/strongly_connected_components_lib_checker.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/graphs/two_edge_components.test.cpp": "2026-04-12 16:21:27 -0600", +"tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp": "2026-04-26 01:52:59 -0600", "tests/library_checker_aizu_tests/handmade_tests/dsu.test.cpp": "2026-01-22 10:08:22 -0700", "tests/library_checker_aizu_tests/handmade_tests/edge_cd_small_trees.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/handmade_tests/fib_matrix_expo.test.cpp": "2026-01-28 21:48:16 -0700", @@ -130,7 +131,7 @@ "tests/library_checker_aizu_tests/strings/suffix_array_short.test.cpp": "2026-04-12 06:15:25 -0600", "tests/library_checker_aizu_tests/strings/trie.test.cpp": "2026-01-17 12:38:18 -0700", "tests/library_checker_aizu_tests/strings/wildcard_pattern_matching.test.cpp": "2025-08-05 19:19:23 -0600", -"tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp": "2026-04-26 01:42:30 -0600", +"tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp": "2026-04-26 01:52:59 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_contour_range_query.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_contour_range_update.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_count_paths_per_length.test.cpp": "2026-04-12 16:21:27 -0600", From 02ae4c628d2af3e90cb701c74551e620e685dc7c Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Sun, 26 Apr 2026 01:58:54 -0600 Subject: [PATCH 5/7] another golf --- library/trees/centroid_decomp.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/library/trees/centroid_decomp.hpp b/library/trees/centroid_decomp.hpp index 9fac10d2..43545826 100644 --- a/library/trees/centroid_decomp.hpp +++ b/library/trees/centroid_decomp.hpp @@ -6,18 +6,18 @@ //! @time O(n log n) //! @space O(n) vi cd(auto& g, auto f) { - vi p(sz(g), -1), siz(sz(g), sz(g)); + vi p(sz(g), -1), s(sz(g), sz(g)); auto ctd = [&](auto ctd, int u, int p, int n) -> int { - siz[u] = 1; + s[u] = 1; for (int v : g[u]) if (v != p) { if (int c = ctd(ctd, v, u, n); c != -1) return c; - siz[u] += siz[v]; + s[u] += s[v]; } - return 2 * siz[u] >= n ? siz[p] = n - siz[u], u : -1; + return 2 * s[u] >= n ? s[p] = n - s[u], u : -1; }; auto dfs = [&](auto dfs, int u) -> int { - f(u = ctd(ctd, u, u, siz[u])); + f(u = ctd(ctd, u, u, s[u])); for (int v : g[u]) erase(g[v], u), p[dfs(dfs, v)] = u; return u; }; From 1860b5da4cfd90549eba2146e1d88be173b787b2 Mon Sep 17 00:00:00 2001 From: GitHub Date: Sun, 26 Apr 2026 08:02:48 +0000 Subject: [PATCH 6/7] [auto-verifier] verify commit 02ae4c628d2af3e90cb701c74551e620e685dc7c --- .verify-helper/timestamps.remote.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index 341cf321..9d2a5e9c 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -74,7 +74,7 @@ "tests/library_checker_aizu_tests/graphs/strongly_connected_components_aizu.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/graphs/strongly_connected_components_lib_checker.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/graphs/two_edge_components.test.cpp": "2026-04-12 16:21:27 -0600", -"tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp": "2026-04-26 01:52:59 -0600", +"tests/library_checker_aizu_tests/handmade_tests/count_paths.test.cpp": "2026-04-26 01:58:54 -0600", "tests/library_checker_aizu_tests/handmade_tests/dsu.test.cpp": "2026-01-22 10:08:22 -0700", "tests/library_checker_aizu_tests/handmade_tests/edge_cd_small_trees.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/handmade_tests/fib_matrix_expo.test.cpp": "2026-01-28 21:48:16 -0700", @@ -131,7 +131,7 @@ "tests/library_checker_aizu_tests/strings/suffix_array_short.test.cpp": "2026-04-12 06:15:25 -0600", "tests/library_checker_aizu_tests/strings/trie.test.cpp": "2026-01-17 12:38:18 -0700", "tests/library_checker_aizu_tests/strings/wildcard_pattern_matching.test.cpp": "2025-08-05 19:19:23 -0600", -"tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp": "2026-04-26 01:52:59 -0600", +"tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp": "2026-04-26 01:58:54 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_contour_range_query.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_contour_range_update.test.cpp": "2026-04-12 16:21:27 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_count_paths_per_length.test.cpp": "2026-04-12 16:21:27 -0600", From 504d4db7562bfd024986f2c42757a4d24c388919 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Sun, 26 Apr 2026 02:13:21 -0600 Subject: [PATCH 7/7] fix formatting --- .../trees/cd_count_paths_per_length.test.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp b/tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp index b64a3e55..de62f430 100644 --- a/tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp +++ b/tests/library_checker_aizu_tests/trees/cd_count_paths_per_length.test.cpp @@ -29,13 +29,15 @@ vector count_paths_per_length(vector adj) { swap(q, new_q); } } - sort(all(child_depths), [&](auto& x, auto& y) { return sz(x) < sz(y); }); + sort(all(child_depths), + [&](auto& x, auto& y) { return sz(x) < sz(y); }); vector total_depth(1, 1.0); for (const auto& cnt_depth : child_depths) { auto prod = conv(total_depth, cnt_depth); rep(i, 1, sz(prod)) num_paths[i] += llround(prod[i]); total_depth.resize(sz(cnt_depth)); - rep(i, 1, sz(cnt_depth)) total_depth[i] += cnt_depth[i]; + rep(i, 1, sz(cnt_depth)) total_depth[i] += + cnt_depth[i]; } }); return num_paths;