From c139baae557a431599152a25c6f880588fc55836 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Mon, 4 Aug 2025 00:39:59 -0600 Subject: [PATCH 01/14] switch test --- library/trees/linear_kth_path.hpp | 25 ------------------- .../trees/kth_path_linear.test.cpp | 14 ++++++++--- 2 files changed, 11 insertions(+), 28 deletions(-) delete mode 100644 library/trees/linear_kth_path.hpp diff --git a/library/trees/linear_kth_path.hpp b/library/trees/linear_kth_path.hpp deleted file mode 100644 index 29f1277b..00000000 --- a/library/trees/linear_kth_path.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once -#include "linear_lca.hpp" -#include "ladder_decomposition/linear_kth_par.hpp" -struct linear_kth_path { - linear_lca lin_lca; - linear_kth_par lin_kp; - linear_kth_path(const auto& adj): - lin_lca(adj), lin_kp(adj) {} - //! @param u,v endpoint nodes of path - //! @param k index into path - //! @returns the node - //! vi({u,p[u],..,lca(u,v),..,p[v],v})[k], or -1, so u if - //! k=0 - //! @time O(1) - //! @space O(1) - int kth_path(int u, int v, int k) { - int lca_d = lin_kp.t[lin_lca.lca(u, v)].d; - int u_lca = lin_kp.t[u].d - lca_d; - int v_lca = lin_kp.t[v].d - lca_d; - if (k <= u_lca) return lin_kp.kth_par(u, k); - if (k <= u_lca + v_lca) - return lin_kp.kth_par(v, u_lca + v_lca - k); - return -1; - } -}; diff --git a/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp b/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp index 40055b99..84d8255b 100644 --- a/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp +++ b/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp @@ -1,7 +1,8 @@ #define PROBLEM \ "https://judge.yosupo.jp/problem/jump_on_tree" #include "../template.hpp" -#include "../../../library/trees/linear_kth_path.hpp" +#include "../../../library/trees/linear_lca.hpp" +#include "../../../library/trees/ladder_decomposition/linear_kth_par.hpp" #include "../../../library/trees/lca_rmq/lca_rmq.hpp" #include "../compress_tree_asserts.hpp" int main() { @@ -15,12 +16,19 @@ int main() { adj[u].push_back(v); adj[v].push_back(u); } - linear_kth_path lin_kth_path(adj); + linear_lca lin_lca(adj); + linear_kth_par lin_kth_par(adj); LCA lc(adj); compress_tree_asserts(adj, lc); while (q--) { int u, v, k; cin >> u >> v >> k; - cout << lin_kth_path.kth_path(u, v, k) << '\n'; + int lca_d = lin_kth_par.t[lin_lca.lca(u, v)].d; + int u_lca = lin_kth_par.t[u].d - lca_d; + int v_lca = lin_kth_par.t[v].d - lca_d; + if (k <= u_lca) cout << lin_kth_par.kth_par(u, k) << '\n'; + else if (k <= u_lca + v_lca) + cout << lin_kth_par.kth_par(v, u_lca + v_lca - k) << '\n'; + else cout << -1 << '\n'; } } From f12260f5f10bc1b90175a9463cce3ad07e4e8282 Mon Sep 17 00:00:00 2001 From: GitHub Date: Mon, 4 Aug 2025 06:43:59 +0000 Subject: [PATCH 02/14] [auto-verifier] verify commit c139baae557a431599152a25c6f880588fc55836 --- .verify-helper/timestamps.remote.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index 7ddafad0..bb1ed7bd 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -133,7 +133,7 @@ "tests/library_checker_aizu_tests/trees/edge_cd_count_paths_per_length.test.cpp": "2025-04-27 21:47:37 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_reroot_dp.test.cpp": "2025-04-27 21:47:37 -0600", "tests/library_checker_aizu_tests/trees/kth_path_ladder.test.cpp": "2025-02-10 23:30:47 -0700", -"tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp": "2025-08-03 23:07:33 -0600", +"tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp": "2025-08-04 00:39:59 -0600", "tests/library_checker_aizu_tests/trees/kth_path_tree_lift.test.cpp": "2025-02-10 14:50:36 -0700", "tests/library_checker_aizu_tests/trees/lca_all_methods_aizu.test.cpp": "2025-08-03 23:07:33 -0600", "tests/library_checker_aizu_tests/trees/lca_all_methods_lib_checker.test.cpp": "2025-08-03 23:07:33 -0600", From d3d4c46606888b06075599103138d661cb489407 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Mon, 4 Aug 2025 03:55:34 -0600 Subject: [PATCH 03/14] add changes --- .../ladder_decomposition/linear_kth_par.hpp | 89 +++++++++---------- .../trees/kth_path_linear.test.cpp | 22 +++-- 2 files changed, 56 insertions(+), 55 deletions(-) diff --git a/library/trees/ladder_decomposition/linear_kth_par.hpp b/library/trees/ladder_decomposition/linear_kth_par.hpp index 6fde5810..27499164 100644 --- a/library/trees/ladder_decomposition/linear_kth_par.hpp +++ b/library/trees/ladder_decomposition/linear_kth_par.hpp @@ -7,62 +7,53 @@ //! } //! vector> adj(n); //! linear_kth_par kp(adj); -//! int kth_par = kp.kth_par(v, k); +//! kp.kth_par(v, k); // k edges up from v +//! kp.kth_par(v, 1); // v's parent //! @endcode -//! kth_par = a node k edges up from v -//! @time O(n + q) -//! @space O(n) -struct linear_kth_par { - struct node { - int d, p = -1, dl, idx_j; - basic_string lad; - }; - vector t; - vector j; +//! @time O(n*(2*KAPPA+1)/(KAPPA-1) + n*2*(KAPPA-1) + q) +//! @space O(n*(2*KAPPA+1)/(KAPPA-1) + n*2*(KAPPA-1)) +template struct linear_kth_par { + int n; + vi d, leaf, pos, jmp; + vector> lad; linear_kth_par(const auto& adj): - t(sz(adj)), j(2 * sz(t)) { - vi st; - int pos = 1; - auto add_j = [&]() -> void { - j[pos] = { - st[max(0, sz(st) - 1 - 2 * (pos & -pos))], - st[max(0, sz(st) - 1 - 4 * (pos & -pos))]}; - pos++; + n(sz(adj)), d(n), leaf(n), pos(n), jmp(2 * n), lad(n) { + static_assert(KAPPA >= 2); + int t = 1; + vi st(n); + auto calc = [&](int siz) { + jmp[t] = st[max(0, siz - (KAPPA - 1) * (t & -t))]; + t++; }; - auto dfs = [&](auto&& self, int v) -> void { - st.push_back(v); - t[v].idx_j = pos, t[v].dl = v; - add_j(); + auto dfs = [&](auto&& self, int v, int p) -> void { + st[d[v]] = leaf[v] = v; + pos[v] = t; + calc(d[v]); for (int u : adj[v]) - if (u != t[v].p) { - t[u].d = t[t[u].p = v].d + 1; - self(self, u); - if (t[t[u].dl].d > t[t[v].dl].d) - t[v].dl = t[u].dl; - add_j(); + if (u != p) { + d[u] = 1 + d[v]; + self(self, u, v); + if (d[leaf[v]] < d[leaf[u]]) leaf[v] = leaf[u]; + calc(d[v]); } - st.pop_back(); + // TODO golf this further + int len = (d[leaf[v]] - d[v]) * (2 * KAPPA + 1) / + (KAPPA - 1); + len = max(len, 2 * (KAPPA - 1)); + int i = d[leaf[v]] - sz(lad[leaf[v]]); + while (i && sz(lad[leaf[v]]) < len) + lad[leaf[v]] += st[i--]; + assert(lad[leaf[v]].back() > 0); }; - rep(i, 0, sz(t)) { - if (t[i].p == -1) dfs(dfs, i); - if (t[i].p == -1 || t[t[i].p].dl != t[i].dl) { - int v = t[i].dl, len = (t[v].d - t[i].d) * 2; - auto& lad = t[v].lad; - for (; v != -1 && len--; v = t[v].p) lad += v; - } - } + dfs(dfs, 0, 0); } int kth_par(int v, int k) { - assert(0 <= k && k <= t[v].d); - switch (k) { - case 0: return v; - case 1: return t[v].p; - case 2: return t[t[v].p].p; - default: - int i = bit_floor(unsigned(k / 3)); - auto [j1, j2] = j[(t[v].idx_j & -i) | i]; - int leaf = t[t[v].d - t[j2].d <= k ? j2 : j1].dl; - return t[leaf].lad[k + t[leaf].d - t[v].d]; - } + assert(0 <= k && k <= d[v]); + int j = v; + if (unsigned b = k / KAPPA; b) + b = bit_floor(b), j = jmp[(pos[v] & -b) | b]; + // TODO array index out of bounds goes uncaught here + // because of basic_string + return j = leaf[j], lad[j][k + d[j] - d[v]]; } }; diff --git a/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp b/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp index 84d8255b..6b951e00 100644 --- a/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp +++ b/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp @@ -17,18 +17,28 @@ int main() { adj[v].push_back(u); } linear_lca lin_lca(adj); - linear_kth_par lin_kth_par(adj); + linear_kth_par<2> lin_kp_2(adj); + linear_kth_par<3> lin_kp_3(adj); + linear_kth_par<4> lin_kp_4(adj); + linear_kth_par<5> lin_kp_5(adj); LCA lc(adj); compress_tree_asserts(adj, lc); + auto get_kth_par = [&](int v, int k) -> int { + int res = lin_kp_2.kth_par(v, k); + assert(res == lin_kp_3.kth_par(v, k)); + assert(res == lin_kp_4.kth_par(v, k)); + assert(res == lin_kp_5.kth_par(v, k)); + return res; + }; while (q--) { int u, v, k; cin >> u >> v >> k; - int lca_d = lin_kth_par.t[lin_lca.lca(u, v)].d; - int u_lca = lin_kth_par.t[u].d - lca_d; - int v_lca = lin_kth_par.t[v].d - lca_d; - if (k <= u_lca) cout << lin_kth_par.kth_par(u, k) << '\n'; + int lca_d = lin_kp_2.d[lin_lca.lca(u, v)]; + int u_lca = lin_kp_2.d[u] - lca_d; + int v_lca = lin_kp_2.d[v] - lca_d; + if (k <= u_lca) cout << get_kth_par(u, k) << '\n'; else if (k <= u_lca + v_lca) - cout << lin_kth_par.kth_par(v, u_lca + v_lca - k) << '\n'; + cout << get_kth_par(v, u_lca + v_lca - k) << '\n'; else cout << -1 << '\n'; } } From 693e4706511c5a83e22efa771a0e43b1b8d71164 Mon Sep 17 00:00:00 2001 From: GitHub Date: Mon, 4 Aug 2025 10:08:08 +0000 Subject: [PATCH 04/14] [auto-verifier] verify commit d3d4c46606888b06075599103138d661cb489407 --- .verify-helper/timestamps.remote.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index bb1ed7bd..91cbcef3 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -72,7 +72,7 @@ "tests/library_checker_aizu_tests/handmade_tests/edge_cd_small_trees.test.cpp": "2025-04-27 21:47:37 -0600", "tests/library_checker_aizu_tests/handmade_tests/fib_matrix_expo.test.cpp": "2024-12-14 19:50:29 -0600", "tests/library_checker_aizu_tests/handmade_tests/functional_graph.test.cpp": "2025-07-08 19:28:25 -0600", -"tests/library_checker_aizu_tests/handmade_tests/lca_ladder_forest.test.cpp": "2025-08-03 23:07:33 -0600", +"tests/library_checker_aizu_tests/handmade_tests/lca_ladder_forest.test.cpp": "2025-08-04 03:55:34 -0600", "tests/library_checker_aizu_tests/handmade_tests/manacher.test.cpp": "2024-12-14 19:50:29 -0600", "tests/library_checker_aizu_tests/handmade_tests/merge_st_and_wavelet.test.cpp": "2025-07-10 12:34:21 -0600", "tests/library_checker_aizu_tests/handmade_tests/mobius.test.cpp": "2025-02-10 14:50:36 -0700", @@ -132,8 +132,7 @@ "tests/library_checker_aizu_tests/trees/edge_cd_contour_range_update.test.cpp": "2025-04-27 21:47:37 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_count_paths_per_length.test.cpp": "2025-04-27 21:47:37 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_reroot_dp.test.cpp": "2025-04-27 21:47:37 -0600", -"tests/library_checker_aizu_tests/trees/kth_path_ladder.test.cpp": "2025-02-10 23:30:47 -0700", -"tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp": "2025-08-04 00:39:59 -0600", +"tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp": "2025-08-04 03:55:34 -0600", "tests/library_checker_aizu_tests/trees/kth_path_tree_lift.test.cpp": "2025-02-10 14:50:36 -0700", "tests/library_checker_aizu_tests/trees/lca_all_methods_aizu.test.cpp": "2025-08-03 23:07:33 -0600", "tests/library_checker_aizu_tests/trees/lca_all_methods_lib_checker.test.cpp": "2025-08-03 23:07:33 -0600", From a7b7c0f643a74b7ab14ba9298b3804f6ed4f61a9 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Mon, 4 Aug 2025 11:57:16 -0600 Subject: [PATCH 05/14] speed up test --- .../trees/kth_path_ladder.test.cpp | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/tests/library_checker_aizu_tests/trees/kth_path_ladder.test.cpp b/tests/library_checker_aizu_tests/trees/kth_path_ladder.test.cpp index e9e0fd8f..55618040 100644 --- a/tests/library_checker_aizu_tests/trees/kth_path_ladder.test.cpp +++ b/tests/library_checker_aizu_tests/trees/kth_path_ladder.test.cpp @@ -16,14 +16,6 @@ int main() { } ladder ld(adj); assert(sz(ld.l_tbl) <= 2 * n - ld.d[0]); - vector> adj_rooted(n + n); - for (int i = 0; i < n; i++) - if (ld.p[i] != i) { - adj_rooted[ld.p[i]].push_back(i); - adj_rooted[ld.p[i] + n].push_back(i + n); - } - ladder ld_rooted(adj_rooted); - linear_kth_par lin_ld_rooted(adj_rooted); while (q--) { int u, v, k; cin >> u >> v >> k; @@ -34,23 +26,10 @@ int main() { else if (k <= u_lca) { int res = ld.kth_par(u, k); assert(res == jmp(ld.b_tbl, u, k)); - assert(res == ld_rooted.kth_par(u, k)); - assert(res == ld_rooted.kth_par(u + n, k) - n); - assert(res == lin_ld_rooted.kth_par(u, k)); - assert(res == lin_ld_rooted.kth_par(u + n, k) - n); cout << res << '\n'; } else { int res = ld.kth_par(v, u_lca + v_lca - k); assert(res == jmp(ld.b_tbl, v, u_lca + v_lca - k)); - assert( - res == ld_rooted.kth_par(v, u_lca + v_lca - k)); - assert(res == - ld_rooted.kth_par(v + n, u_lca + v_lca - k) - n); - assert(res == - lin_ld_rooted.kth_par(v, u_lca + v_lca - k)); - assert(res == - lin_ld_rooted.kth_par(v + n, u_lca + v_lca - k) - - n); cout << res << '\n'; } } From 7fc068fb77d079bdc7788335ae751cde79d03b66 Mon Sep 17 00:00:00 2001 From: GitHub Date: Mon, 4 Aug 2025 17:59:48 +0000 Subject: [PATCH 06/14] [auto-verifier] verify commit a7b7c0f643a74b7ab14ba9298b3804f6ed4f61a9 --- .verify-helper/timestamps.remote.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index 91cbcef3..a37095b1 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -132,6 +132,7 @@ "tests/library_checker_aizu_tests/trees/edge_cd_contour_range_update.test.cpp": "2025-04-27 21:47:37 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_count_paths_per_length.test.cpp": "2025-04-27 21:47:37 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_reroot_dp.test.cpp": "2025-04-27 21:47:37 -0600", +"tests/library_checker_aizu_tests/trees/kth_path_ladder.test.cpp": "2025-08-04 11:57:16 -0600", "tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp": "2025-08-04 03:55:34 -0600", "tests/library_checker_aizu_tests/trees/kth_path_tree_lift.test.cpp": "2025-02-10 14:50:36 -0700", "tests/library_checker_aizu_tests/trees/lca_all_methods_aizu.test.cpp": "2025-08-03 23:07:33 -0600", From ffd205e12753ec1596a515f216f47e3993792b3f Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Mon, 4 Aug 2025 16:41:45 -0600 Subject: [PATCH 07/14] convert back to vector --- library/trees/ladder_decomposition/linear_kth_par.hpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/library/trees/ladder_decomposition/linear_kth_par.hpp b/library/trees/ladder_decomposition/linear_kth_par.hpp index 27499164..0e69e9e9 100644 --- a/library/trees/ladder_decomposition/linear_kth_par.hpp +++ b/library/trees/ladder_decomposition/linear_kth_par.hpp @@ -15,7 +15,7 @@ template struct linear_kth_par { int n; vi d, leaf, pos, jmp; - vector> lad; + vector lad; linear_kth_par(const auto& adj): n(sz(adj)), d(n), leaf(n), pos(n), jmp(2 * n), lad(n) { static_assert(KAPPA >= 2); @@ -42,7 +42,7 @@ template struct linear_kth_par { len = max(len, 2 * (KAPPA - 1)); int i = d[leaf[v]] - sz(lad[leaf[v]]); while (i && sz(lad[leaf[v]]) < len) - lad[leaf[v]] += st[i--]; + lad[leaf[v]].push_back(st[i--]); assert(lad[leaf[v]].back() > 0); }; dfs(dfs, 0, 0); @@ -52,8 +52,6 @@ template struct linear_kth_par { int j = v; if (unsigned b = k / KAPPA; b) b = bit_floor(b), j = jmp[(pos[v] & -b) | b]; - // TODO array index out of bounds goes uncaught here - // because of basic_string return j = leaf[j], lad[j][k + d[j] - d[v]]; } }; From 498ba0fd9d16a0168fae1ba21c727efa55c8ca39 Mon Sep 17 00:00:00 2001 From: GitHub Date: Mon, 4 Aug 2025 22:50:04 +0000 Subject: [PATCH 08/14] [auto-verifier] verify commit ffd205e12753ec1596a515f216f47e3993792b3f --- .verify-helper/timestamps.remote.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json index a37095b1..673ee8ba 100644 --- a/.verify-helper/timestamps.remote.json +++ b/.verify-helper/timestamps.remote.json @@ -72,7 +72,7 @@ "tests/library_checker_aizu_tests/handmade_tests/edge_cd_small_trees.test.cpp": "2025-04-27 21:47:37 -0600", "tests/library_checker_aizu_tests/handmade_tests/fib_matrix_expo.test.cpp": "2024-12-14 19:50:29 -0600", "tests/library_checker_aizu_tests/handmade_tests/functional_graph.test.cpp": "2025-07-08 19:28:25 -0600", -"tests/library_checker_aizu_tests/handmade_tests/lca_ladder_forest.test.cpp": "2025-08-04 03:55:34 -0600", +"tests/library_checker_aizu_tests/handmade_tests/lca_ladder_forest.test.cpp": "2025-08-04 16:41:45 -0600", "tests/library_checker_aizu_tests/handmade_tests/manacher.test.cpp": "2024-12-14 19:50:29 -0600", "tests/library_checker_aizu_tests/handmade_tests/merge_st_and_wavelet.test.cpp": "2025-07-10 12:34:21 -0600", "tests/library_checker_aizu_tests/handmade_tests/mobius.test.cpp": "2025-02-10 14:50:36 -0700", @@ -132,8 +132,7 @@ "tests/library_checker_aizu_tests/trees/edge_cd_contour_range_update.test.cpp": "2025-04-27 21:47:37 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_count_paths_per_length.test.cpp": "2025-04-27 21:47:37 -0600", "tests/library_checker_aizu_tests/trees/edge_cd_reroot_dp.test.cpp": "2025-04-27 21:47:37 -0600", -"tests/library_checker_aizu_tests/trees/kth_path_ladder.test.cpp": "2025-08-04 11:57:16 -0600", -"tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp": "2025-08-04 03:55:34 -0600", +"tests/library_checker_aizu_tests/trees/kth_path_ladder.test.cpp": "2025-08-04 16:41:45 -0600", "tests/library_checker_aizu_tests/trees/kth_path_tree_lift.test.cpp": "2025-02-10 14:50:36 -0700", "tests/library_checker_aizu_tests/trees/lca_all_methods_aizu.test.cpp": "2025-08-03 23:07:33 -0600", "tests/library_checker_aizu_tests/trees/lca_all_methods_lib_checker.test.cpp": "2025-08-03 23:07:33 -0600", From 3059b7f1bcb12675aa553d2d05a156fd5b43cadc Mon Sep 17 00:00:00 2001 From: GitHub Date: Tue, 5 Aug 2025 03:34:08 +0000 Subject: [PATCH 09/14] [auto-verifier] verify commit 738bbf1d194da0100755ccfb457cf38c18a6ef46 --- .verify-helper/timestamps.remote.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .verify-helper/timestamps.remote.json diff --git a/.verify-helper/timestamps.remote.json b/.verify-helper/timestamps.remote.json new file mode 100644 index 00000000..14af3fd2 --- /dev/null +++ b/.verify-helper/timestamps.remote.json @@ -0,0 +1,21 @@ +{ +"tests/library_checker_aizu_tests/convolution/gcd_convolution.test.cpp": "2025-06-25 15:06:18 -0600", +"tests/library_checker_aizu_tests/convolution/lcm_convolution.test.cpp": "2025-06-25 15:06:18 -0600", +"tests/library_checker_aizu_tests/convolution/min_plus_convolution.test.cpp": "2024-11-17 14:04:03 -0600", +"tests/library_checker_aizu_tests/data_structures/binary_search_example.test.cpp": "2024-11-18 10:51:39 -0600", +"tests/library_checker_aizu_tests/data_structures/binary_trie.test.cpp": "2024-11-17 14:04:03 -0600", +"tests/library_checker_aizu_tests/data_structures/bit.test.cpp": "2024-12-14 19:50:29 -0600", +"tests/library_checker_aizu_tests/data_structures/bit_inc.test.cpp": "2024-11-18 09:44:22 -0600", +"tests/library_checker_aizu_tests/data_structures/bit_ordered_set.test.cpp": "2024-12-15 14:34:10 -0600", +"tests/library_checker_aizu_tests/data_structures/bit_rupq.test.cpp": "2024-12-05 10:41:42 -0600", +"tests/library_checker_aizu_tests/data_structures/bit_rurq.test.cpp": "2024-12-05 10:41:42 -0600", +"tests/library_checker_aizu_tests/data_structures/bit_walk.test.cpp": "2024-12-14 19:50:29 -0600", +"tests/library_checker_aizu_tests/data_structures/deque.test.cpp": "2025-06-23 03:43:10 -0600", +"tests/library_checker_aizu_tests/data_structures/deque_op.test.cpp": "2025-06-23 03:43:10 -0600", +"tests/library_checker_aizu_tests/data_structures/deque_sliding_window.test.cpp": "2025-06-23 03:43:10 -0600", +"tests/library_checker_aizu_tests/data_structures/disjoint_rmq_inc.test.cpp": "2024-12-14 15:47:13 -0600", +"tests/library_checker_aizu_tests/data_structures/disjoint_rmq_inc_lines.test.cpp": "2024-12-14 15:47:13 -0600", +"tests/library_checker_aizu_tests/data_structures/disjoint_rmq_lines.test.cpp": "2024-12-14 15:47:13 -0600", +"tests/library_checker_aizu_tests/data_structures/disjoint_rmq_sum.test.cpp": "2024-12-14 15:47:13 -0600", +"tests/library_checker_aizu_tests/data_structures/distinct_query.test.cpp": "2024-12-05 10:41:42 -0600" +} \ No newline at end of file From 6d36a0e7dcf807af7d9c7546228e3a59d8050367 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Mon, 4 Aug 2025 21:43:30 -0600 Subject: [PATCH 10/14] final golf --- .../ladder_decomposition/linear_kth_par.hpp | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/library/trees/ladder_decomposition/linear_kth_par.hpp b/library/trees/ladder_decomposition/linear_kth_par.hpp index 0e69e9e9..a9afe913 100644 --- a/library/trees/ladder_decomposition/linear_kth_par.hpp +++ b/library/trees/ladder_decomposition/linear_kth_par.hpp @@ -10,8 +10,8 @@ //! kp.kth_par(v, k); // k edges up from v //! kp.kth_par(v, 1); // v's parent //! @endcode -//! @time O(n*(2*KAPPA+1)/(KAPPA-1) + n*2*(KAPPA-1) + q) -//! @space O(n*(2*KAPPA+1)/(KAPPA-1) + n*2*(KAPPA-1)) +//! @time O(n*max((2*KAPPA+1)/(KAPPA-1),2*(KAPPA-1)) + q) +//! @space O(n*max((2*KAPPA+1)/(KAPPA-1),2*(KAPPA-1))) template struct linear_kth_par { int n; vi d, leaf, pos, jmp; @@ -26,24 +26,21 @@ template struct linear_kth_par { t++; }; auto dfs = [&](auto&& self, int v, int p) -> void { - st[d[v]] = leaf[v] = v; + st[d[v]] = v; + int& l = leaf[v] = v; pos[v] = t; calc(d[v]); for (int u : adj[v]) if (u != p) { d[u] = 1 + d[v]; self(self, u, v); - if (d[leaf[v]] < d[leaf[u]]) leaf[v] = leaf[u]; + if (d[l] < d[leaf[u]]) l = leaf[u]; calc(d[v]); } - // TODO golf this further - int len = (d[leaf[v]] - d[v]) * (2 * KAPPA + 1) / - (KAPPA - 1); - len = max(len, 2 * (KAPPA - 1)); - int i = d[leaf[v]] - sz(lad[leaf[v]]); - while (i && sz(lad[leaf[v]]) < len) - lad[leaf[v]].push_back(st[i--]); - assert(lad[leaf[v]].back() > 0); + int s = + (d[l] - d[v]) * (2 * KAPPA + 1) / (KAPPA - 1); + s = min(max(s, 2 * (KAPPA - 1)), d[l] + 1); + rep(i, sz(lad[l]), s) lad[l].push_back(st[d[l] - i]); }; dfs(dfs, 0, 0); } From ce8dc257303b4ba5e4576bd0e59d959cb85abaf6 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Mon, 4 Aug 2025 22:02:14 -0600 Subject: [PATCH 11/14] adding git ignore to try to fix CI --- .verify-helper/.gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .verify-helper/.gitignore diff --git a/.verify-helper/.gitignore b/.verify-helper/.gitignore new file mode 100644 index 00000000..e69de29b From eb0d626754819b46a1debf08cf083646b3462c46 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Mon, 4 Aug 2025 22:33:00 -0600 Subject: [PATCH 12/14] final nits --- .../ladder_decomposition/linear_kth_par.hpp | 17 ++++++++--------- .../trees/kth_path_linear.test.cpp | 6 +++--- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/library/trees/ladder_decomposition/linear_kth_par.hpp b/library/trees/ladder_decomposition/linear_kth_par.hpp index a9afe913..17f93e93 100644 --- a/library/trees/ladder_decomposition/linear_kth_par.hpp +++ b/library/trees/ladder_decomposition/linear_kth_par.hpp @@ -10,19 +10,19 @@ //! kp.kth_par(v, k); // k edges up from v //! kp.kth_par(v, 1); // v's parent //! @endcode -//! @time O(n*max((2*KAPPA+1)/(KAPPA-1),2*(KAPPA-1)) + q) -//! @space O(n*max((2*KAPPA+1)/(KAPPA-1),2*(KAPPA-1))) -template struct linear_kth_par { +//! @time O(n*max((2*KAPPA+3)/KAPPA,2*KAPPA) + q) +//! @space O(n*max((2*KAPPA+3)/KAPPA,2*KAPPA)) +template struct linear_kth_par { int n; vi d, leaf, pos, jmp; vector lad; linear_kth_par(const auto& adj): n(sz(adj)), d(n), leaf(n), pos(n), jmp(2 * n), lad(n) { - static_assert(KAPPA >= 2); + static_assert(KAPPA >= 1); int t = 1; vi st(n); auto calc = [&](int siz) { - jmp[t] = st[max(0, siz - (KAPPA - 1) * (t & -t))]; + jmp[t] = st[max(0, siz - KAPPA * (t & -t))]; t++; }; auto dfs = [&](auto&& self, int v, int p) -> void { @@ -37,9 +37,8 @@ template struct linear_kth_par { if (d[l] < d[leaf[u]]) l = leaf[u]; calc(d[v]); } - int s = - (d[l] - d[v]) * (2 * KAPPA + 1) / (KAPPA - 1); - s = min(max(s, 2 * (KAPPA - 1)), d[l] + 1); + int s = (d[l] - d[v]) * (2 * KAPPA + 3) / KAPPA; + s = min(max(s, 2 * KAPPA), d[l] + 1); rep(i, sz(lad[l]), s) lad[l].push_back(st[d[l] - i]); }; dfs(dfs, 0, 0); @@ -47,7 +46,7 @@ template struct linear_kth_par { int kth_par(int v, int k) { assert(0 <= k && k <= d[v]); int j = v; - if (unsigned b = k / KAPPA; b) + if (unsigned b = k / (KAPPA + 1); b) b = bit_floor(b), j = jmp[(pos[v] & -b) | b]; return j = leaf[j], lad[j][k + d[j] - d[v]]; } diff --git a/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp b/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp index 6b951e00..51aae584 100644 --- a/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp +++ b/tests/library_checker_aizu_tests/trees/kth_path_linear.test.cpp @@ -17,17 +17,17 @@ int main() { adj[v].push_back(u); } linear_lca lin_lca(adj); + linear_kth_par<1> lin_kp_1(adj); linear_kth_par<2> lin_kp_2(adj); linear_kth_par<3> lin_kp_3(adj); linear_kth_par<4> lin_kp_4(adj); - linear_kth_par<5> lin_kp_5(adj); LCA lc(adj); compress_tree_asserts(adj, lc); auto get_kth_par = [&](int v, int k) -> int { - int res = lin_kp_2.kth_par(v, k); + int res = lin_kp_1.kth_par(v, k); + assert(res == lin_kp_2.kth_par(v, k)); assert(res == lin_kp_3.kth_par(v, k)); assert(res == lin_kp_4.kth_par(v, k)); - assert(res == lin_kp_5.kth_par(v, k)); return res; }; while (q--) { From 98df26a72060c9f47aa71a809a64d55f32d322ec Mon Sep 17 00:00:00 2001 From: GitHub Date: Tue, 5 Aug 2025 04:33:39 +0000 Subject: [PATCH 13/14] [auto-verifier] remove .verify-helper/.gitignore (see https://github.com/online-judge-tools/verification-helper/issues/332) --- .verify-helper/.gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .verify-helper/.gitignore diff --git a/.verify-helper/.gitignore b/.verify-helper/.gitignore deleted file mode 100644 index e69de29b..00000000 From f450257588a4856ab8db50fcf59378e1e8470a10 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Mon, 4 Aug 2025 22:35:15 -0600 Subject: [PATCH 14/14] nit --- library/trees/ladder_decomposition/linear_kth_par.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/trees/ladder_decomposition/linear_kth_par.hpp b/library/trees/ladder_decomposition/linear_kth_par.hpp index 17f93e93..4c68b387 100644 --- a/library/trees/ladder_decomposition/linear_kth_par.hpp +++ b/library/trees/ladder_decomposition/linear_kth_par.hpp @@ -25,7 +25,7 @@ template struct linear_kth_par { jmp[t] = st[max(0, siz - KAPPA * (t & -t))]; t++; }; - auto dfs = [&](auto&& self, int v, int p) -> void { + auto dfs = [&](auto&& self, int v, int p) { st[d[v]] = v; int& l = leaf[v] = v; pos[v] = t;