From e46ec3630e5562beb37793e5f569cb89cac5ff91 Mon Sep 17 00:00:00 2001 From: maspypy Date: Sun, 15 Sep 2024 03:44:03 +0900 Subject: [PATCH] add test --- .../gen/query.h | 45 ++++- .../gen/typical_tree_max_degree.cpp | 177 ++++++++++++++++++ .../hash.json | 22 ++- .../info.toml | 3 + .../gen/query.h | 43 ++++- .../gen/typical_tree_max_degree.cpp | 176 +++++++++++++++++ .../hash.json | 22 ++- .../info.toml | 3 + 8 files changed, 485 insertions(+), 6 deletions(-) create mode 100644 tree/point_set_tree_path_composite_sum/gen/typical_tree_max_degree.cpp create mode 100644 tree/point_set_tree_path_composite_sum_fixed_root/gen/typical_tree_max_degree.cpp diff --git a/tree/point_set_tree_path_composite_sum/gen/query.h b/tree/point_set_tree_path_composite_sum/gen/query.h index 16f98adf3..58accaa2e 100644 --- a/tree/point_set_tree_path_composite_sum/gen/query.h +++ b/tree/point_set_tree_path_composite_sum/gen/query.h @@ -12,8 +12,7 @@ struct QueryData { int N, Q; vector cmd, I, X, Y, R; - QueryData(int _n, int _q, Random& gen) - : N(_n), Q(_q), cmd(Q), I(Q), X(Q), Y(Q, -1), R(Q) { + QueryData(int _n, int _q, Random& gen) : N(_n), Q(_q), cmd(Q), I(Q), X(Q), Y(Q, -1), R(Q) { for (int i = 0; i < Q; i++) { cmd[i] = gen.uniform(0, 1); if (N == 1) cmd[i] = 0; @@ -40,3 +39,45 @@ struct QueryData { } } }; + +struct QueryData_degree { + int N, Q; + vector cmd, I, X, Y, R; + + QueryData_degree(int _n, int _q, Random& gen, vector deg) : N(_n), Q(_q), cmd(Q), I(Q), X(Q), Y(Q, -1), R(Q) { + vector S; + for (int i = 0; i < N; ++i) { + for (int cnt = 0; cnt < deg[i]; ++cnt) S.emplace_back(i); + } + if (S.empty()) S.emplace_back(0); + auto random_S = [&]() -> int { + int idx = gen.uniform(0, int(S.size()) - 1); + return S[idx]; + }; + + for (int i = 0; i < Q; i++) { + cmd[i] = gen.uniform(0, 1); + if (N == 1) cmd[i] = 0; + if (cmd[i] == 0) { + I[i] = random_S(); + X[i] = gen.uniform(A_MIN, MOD - 1); + R[i] = random_S(); + } else { + I[i] = gen.uniform(0, N - 2); + X[i] = gen.uniform(B_MIN, MOD - 1); + Y[i] = gen.uniform(C_MIN, MOD - 1); + R[i] = random_S(); + } + } + } + + void print() { + for (int i = 0; i < Q; i++) { + if (cmd[i] == 0) { + printf("%d %d %d %d\n", cmd[i], I[i], X[i], R[i]); + } else { + printf("%d %d %d %d %d\n", cmd[i], I[i], X[i], Y[i], R[i]); + } + } + } +}; diff --git a/tree/point_set_tree_path_composite_sum/gen/typical_tree_max_degree.cpp b/tree/point_set_tree_path_composite_sum/gen/typical_tree_max_degree.cpp new file mode 100644 index 000000000..b88baa08c --- /dev/null +++ b/tree/point_set_tree_path_composite_sum/gen/typical_tree_max_degree.cpp @@ -0,0 +1,177 @@ + +#include +#include +#include +#include + +#include "../params.h" +#include "query.h" +#include "random.h" + +struct Tree { + int n = 1; + std::vector> edges; + + void shuffle_nodes(Random& rng) { + auto perm = rng.perm(n); + for (auto& e: edges) { + e.first = perm[e.first]; + e.second = perm[e.second]; + } + } + void shuffle_edges(Random& rng, bool can_flip = true) { + rng.shuffle(edges.begin(), edges.end()); + if (can_flip) { + for (auto& e: edges) { + if (rng.uniform_bool()) std::swap(e.first, e.second); + } + } + } + + void push(int u, int v) { edges.emplace_back(u, v); } + + void expand_random_edges(Random& rng, int count) { + assert(n >= 2); + int fixn = n; + for (int i = 0; i < count; i++) { + int e = rng.uniform(0, fixn - 2); + push(edges[e].first, n); + edges[e].first = n; + n++; + } + } + + void join_random_edges(Random& rng, int count) { + int fixn = n; + for (int i = 0; i < count; i++) { + push(rng.uniform(0, fixn - 1), n); + n++; + } + } + + void toCentipede() { + int fixn = n; + for (int i = 0; i < fixn; i++) { + push(i, n); + n++; + } + } + + static Tree Line(int n) { + Tree res; + res.n = n; + for (int i = 0; i < n - 1; i++) res.push(i, i + 1); + return res; + } + + static Tree Star(int n) { + Tree res; + res.n = n; + for (int i = 0; i < n - 1; i++) res.push(0, i + 1); + return res; + } + + static Tree KLines(int n, int k) { + assert(3 <= k); + Tree res; + res.n = n; + for (int i = 1; i < n; i++) res.push(std::max(0, i - k), i); + return res; + } + + static Tree KAry(int n, int k) { + assert(2 <= k); + Tree res; + res.n = n; + for (int i = 0; i < n - 1; i++) res.push(i / k, i + 1); + return res; + } + + static Tree Broom(int n, int line_length) { + assert(line_length <= n); + Tree res; + res.n = n; + for (int i = 0; i < line_length; i++) res.push(i, i + 1); + for (int i = line_length; i < n - 1; i++) res.push(line_length - 1, i + 1); + return res; + } + + static Tree LongestPathDecompositionKiller(int n) { + assert(n >= 10); + Tree res; + res.n = n; + std::vector rt; + int now_n = 0; + for (int len = 1;; len += 2) { + if (now_n + len > n) break; + for (int i = 0; i < len - 1; i++) { res.push(now_n + i, now_n + i + 1); } + rt.push_back(now_n); + now_n += len; + } + for (int i = 0; i + 1 < (int)rt.size(); i++) { res.push(rt[i], rt[i + 1]); } + for (int i = now_n; i < n; i++) { res.push(i - 1, i); } + return res; + } + + static Tree GenerateByTemplateId(Random& rng, int id, int n) { + assert(n >= 10); + assert(id >= 0); + if (id-- == 0) return Line(n); + if (id-- == 0) return Star(n); + if (id-- == 0) return KAry(n, 2); + if (id-- == 0) return LongestPathDecompositionKiller(n); + if (id-- == 0) { + auto res = Line(n / 2); + res.toCentipede(); + res.join_random_edges(rng, n % 2); + return res; + } + if (id-- == 0) return Broom(n, (long long)n * 2 / 5); + if (id-- == 0) return Broom(n, (long long)n * 3 / 5); + if (id-- == 0) return KLines(n, 3); + if (id-- == 0) return KAry(n, 3); + if (id-- == 0) { + auto res = Star(n / 2); + res.expand_random_edges(rng, n / 2); + return res; + } + assert(false); + } +}; + +int main(int, char* argv[]) { + int id = (int)atoll(argv[1]); + long long seed = atoll(argv[1]); + auto gen = Random(seed); + + int N = N_MAX; + int Q = Q_MAX; + + Tree tree = Tree::GenerateByTemplateId(gen, id, N); + tree.shuffle_edges(gen); + tree.shuffle_nodes(gen); + + std::vector A(N), B(N - 1), C(N - 1); + for (int i = 0; i < N; i++) A[i] = gen.uniform(A_MIN, MOD - 1); + for (int i = 0; i < N - 1; i++) B[i] = gen.uniform(B_MIN, MOD - 1); + for (int i = 0; i < N - 1; i++) C[i] = gen.uniform(C_MIN, MOD - 1); + + printf("%d %d\n", N, Q); + + for (int i = 0; i < N; i++) { + if (i) printf(" "); + printf("%d", A[i]); + } + printf("\n"); + + vector deg(N); + + for (int i = 0; i < N - 1; i++) { + printf("%d %d %d %d\n", tree.edges[i].first, tree.edges[i].second, B[i], C[i]); + deg[tree.edges[i].first]++, deg[tree.edges[i].second]++; + } + + QueryData_degree qd{N, Q, gen, deg}; + qd.print(); + return 0; +} diff --git a/tree/point_set_tree_path_composite_sum/hash.json b/tree/point_set_tree_path_composite_sum/hash.json index 150692130..c5c441998 100644 --- a/tree/point_set_tree_path_composite_sum/hash.json +++ b/tree/point_set_tree_path_composite_sum/hash.json @@ -30,5 +30,25 @@ "typical_tree_max_08.in": "b3836b3b2ac7cea93e18b7bbe776e50fe9d758e8be80626b08bbf692ea4b9a8b", "typical_tree_max_08.out": "53626225161187fa26a650c1f5a2e1453c050cb4e165a77fa9269f7a3be92e1f", "typical_tree_max_09.in": "030edc92a2fba1e566740cd2e34eb84651d13da4c562a9bf292507a5692657f6", - "typical_tree_max_09.out": "4f62c9600672121ca33a1223baef50a711e1eb75788b85525280d0aa6c6fdf39" + "typical_tree_max_09.out": "4f62c9600672121ca33a1223baef50a711e1eb75788b85525280d0aa6c6fdf39", + "typical_tree_max_degree_00.in": "d5f398524a11778031340ca2aad452da7b7b241167c523d5c31fd638c8ea8931", + "typical_tree_max_degree_00.out": "6c6d1cbe1229e24b5c9d731f909e877700abe27d8eb4c8310ce0de8d48de229e", + "typical_tree_max_degree_01.in": "1696ba8a50219381752b36de5a93c299e93dc0c35baa8701a7c7b5cf06692093", + "typical_tree_max_degree_01.out": "d6d76f403d2f89f0258e4ac24055282833d8a8bde272221a1d12139dc31b33fa", + "typical_tree_max_degree_02.in": "87c4bf0b434951621ee8f8cfa84ecb5da825e228a4c5c1f58856737cfd68617d", + "typical_tree_max_degree_02.out": "3e26c37d7c9501acc7e9df35f3d4570324e101bd27779dfe258773619e7707c2", + "typical_tree_max_degree_03.in": "b8811f61945eb7416e99bd5cd0dbf0c1ceea4805e9082d1ffe637c11a4c6a9f9", + "typical_tree_max_degree_03.out": "6390a58a17f225d436098f055350abe910099a0f686b637a6eb4d378a538c570", + "typical_tree_max_degree_04.in": "d8f4658d976bc8ed4c31e40db126c74d0feacc6167ba89914d4c041452f724d1", + "typical_tree_max_degree_04.out": "e5a9208537ddb313b12ad3d22c8b91416cec0c54b8d34ff461aa4176cd7b56a0", + "typical_tree_max_degree_05.in": "ddb79d54e85c3615d1ec8607ae8784c949d8b80255f0a58fb425e309427ac563", + "typical_tree_max_degree_05.out": "4a73f0501333d8ac402b078521f21e97fc832aa3c824104e26ce3aeb9b2cf836", + "typical_tree_max_degree_06.in": "475e3aa8fb14ab7ec7a0897b10da0b19a887a10bf7ec8191c5852043d3575847", + "typical_tree_max_degree_06.out": "2dd2fe91fe8e6236339cb455b2291d6823961ff34adf27917712dbd0783668cb", + "typical_tree_max_degree_07.in": "e34caaaf981870421a58c3c4cb27f5dc0f86c13db6695cc1320b989e824e7a02", + "typical_tree_max_degree_07.out": "e94e2df60e725c8867ed1a16b6a92f9004eddf4872e8a2495cd2ed63ab3e89fb", + "typical_tree_max_degree_08.in": "d26f3ea477319aa2c5c0bda0bb48b28fd3671c52d8c86a53a3a5343c1e398a4c", + "typical_tree_max_degree_08.out": "2894000ea382d7b073d4fb6796149627b59497b6c809a110cbc6ebac40a63a2a", + "typical_tree_max_degree_09.in": "339f20acaf869b992dd161950233e2a4a107909844c355c45beda7b725cab96e", + "typical_tree_max_degree_09.out": "c6a37a2bb30f16fc37d722d73fe75f3ab90514f90d4412ebe7232ca0a1b14729" } \ No newline at end of file diff --git a/tree/point_set_tree_path_composite_sum/info.toml b/tree/point_set_tree_path_composite_sum/info.toml index e66b96306..c6051aacc 100644 --- a/tree/point_set_tree_path_composite_sum/info.toml +++ b/tree/point_set_tree_path_composite_sum/info.toml @@ -14,6 +14,9 @@ forum = "https://github.com/yosupo06/library-checker-problems/issues/1142" [[tests]] name = "typical_tree_max.cpp" number = 10 +[[tests]] + name = "typical_tree_max_degree.cpp" + number = 10 [[solutions]] name = "naive.cpp" diff --git a/tree/point_set_tree_path_composite_sum_fixed_root/gen/query.h b/tree/point_set_tree_path_composite_sum_fixed_root/gen/query.h index f5c2add96..321eb6382 100644 --- a/tree/point_set_tree_path_composite_sum_fixed_root/gen/query.h +++ b/tree/point_set_tree_path_composite_sum_fixed_root/gen/query.h @@ -12,8 +12,7 @@ struct QueryData { int N, Q; vector cmd, I, X, Y; - QueryData(int _n, int _q, Random& gen) - : N(_n), Q(_q), cmd(Q), I(Q), X(Q), Y(Q, -1) { + QueryData(int _n, int _q, Random& gen) : N(_n), Q(_q), cmd(Q), I(Q), X(Q), Y(Q, -1) { for (int i = 0; i < Q; i++) { cmd[i] = gen.uniform(0, 1); if (N == 1) cmd[i] = 0; @@ -38,3 +37,43 @@ struct QueryData { } } }; + +struct QueryData_degree { + int N, Q; + vector cmd, I, X, Y; + + QueryData_degree(int _n, int _q, Random& gen, vector deg) : N(_n), Q(_q), cmd(Q), I(Q), X(Q), Y(Q, -1) { + vector S; + for (int i = 0; i < N; ++i) { + for (int cnt = 0; cnt < deg[i]; ++cnt) S.emplace_back(i); + } + if (S.empty()) S.emplace_back(0); + auto random_S = [&]() -> int { + int idx = gen.uniform(0, int(S.size()) - 1); + return S[idx]; + }; + + for (int i = 0; i < Q; i++) { + cmd[i] = gen.uniform(0, 1); + if (N == 1) cmd[i] = 0; + if (cmd[i] == 0) { + I[i] = random_S(); + X[i] = gen.uniform(A_MIN, MOD - 1); + } else { + I[i] = gen.uniform(0, N - 2); + X[i] = gen.uniform(B_MIN, MOD - 1); + Y[i] = gen.uniform(C_MIN, MOD - 1); + } + } + } + + void print() { + for (int i = 0; i < Q; i++) { + if (cmd[i] == 0) { + printf("%d %d %d\n", cmd[i], I[i], X[i]); + } else { + printf("%d %d %d %d\n", cmd[i], I[i], X[i], Y[i]); + } + } + } +}; diff --git a/tree/point_set_tree_path_composite_sum_fixed_root/gen/typical_tree_max_degree.cpp b/tree/point_set_tree_path_composite_sum_fixed_root/gen/typical_tree_max_degree.cpp new file mode 100644 index 000000000..fd26dd9b5 --- /dev/null +++ b/tree/point_set_tree_path_composite_sum_fixed_root/gen/typical_tree_max_degree.cpp @@ -0,0 +1,176 @@ + +#include +#include +#include +#include + +#include "../params.h" +#include "query.h" +#include "random.h" + +struct Tree { + int n = 1; + std::vector> edges; + + void shuffle_nodes(Random& rng) { + auto perm = rng.perm(n); + for (auto& e: edges) { + e.first = perm[e.first]; + e.second = perm[e.second]; + } + } + void shuffle_edges(Random& rng, bool can_flip = true) { + rng.shuffle(edges.begin(), edges.end()); + if (can_flip) { + for (auto& e: edges) { + if (rng.uniform_bool()) std::swap(e.first, e.second); + } + } + } + + void push(int u, int v) { edges.emplace_back(u, v); } + + void expand_random_edges(Random& rng, int count) { + assert(n >= 2); + int fixn = n; + for (int i = 0; i < count; i++) { + int e = rng.uniform(0, fixn - 2); + push(edges[e].first, n); + edges[e].first = n; + n++; + } + } + + void join_random_edges(Random& rng, int count) { + int fixn = n; + for (int i = 0; i < count; i++) { + push(rng.uniform(0, fixn - 1), n); + n++; + } + } + + void toCentipede() { + int fixn = n; + for (int i = 0; i < fixn; i++) { + push(i, n); + n++; + } + } + + static Tree Line(int n) { + Tree res; + res.n = n; + for (int i = 0; i < n - 1; i++) res.push(i, i + 1); + return res; + } + + static Tree Star(int n) { + Tree res; + res.n = n; + for (int i = 0; i < n - 1; i++) res.push(0, i + 1); + return res; + } + + static Tree KLines(int n, int k) { + assert(3 <= k); + Tree res; + res.n = n; + for (int i = 1; i < n; i++) res.push(std::max(0, i - k), i); + return res; + } + + static Tree KAry(int n, int k) { + assert(2 <= k); + Tree res; + res.n = n; + for (int i = 0; i < n - 1; i++) res.push(i / k, i + 1); + return res; + } + + static Tree Broom(int n, int line_length) { + assert(line_length <= n); + Tree res; + res.n = n; + for (int i = 0; i < line_length; i++) res.push(i, i + 1); + for (int i = line_length; i < n - 1; i++) res.push(line_length - 1, i + 1); + return res; + } + + static Tree LongestPathDecompositionKiller(int n) { + assert(n >= 10); + Tree res; + res.n = n; + std::vector rt; + int now_n = 0; + for (int len = 1;; len += 2) { + if (now_n + len > n) break; + for (int i = 0; i < len - 1; i++) { res.push(now_n + i, now_n + i + 1); } + rt.push_back(now_n); + now_n += len; + } + for (int i = 0; i + 1 < (int)rt.size(); i++) { res.push(rt[i], rt[i + 1]); } + for (int i = now_n; i < n; i++) { res.push(i - 1, i); } + return res; + } + + static Tree GenerateByTemplateId(Random& rng, int id, int n) { + assert(n >= 10); + assert(id >= 0); + if (id-- == 0) return Line(n); + if (id-- == 0) return Star(n); + if (id-- == 0) return KAry(n, 2); + if (id-- == 0) return LongestPathDecompositionKiller(n); + if (id-- == 0) { + auto res = Line(n / 2); + res.toCentipede(); + res.join_random_edges(rng, n % 2); + return res; + } + if (id-- == 0) return Broom(n, (long long)n * 2 / 5); + if (id-- == 0) return Broom(n, (long long)n * 3 / 5); + if (id-- == 0) return KLines(n, 3); + if (id-- == 0) return KAry(n, 3); + if (id-- == 0) { + auto res = Star(n / 2); + res.expand_random_edges(rng, n / 2); + return res; + } + assert(false); + } +}; + +int main(int, char* argv[]) { + int id = (int)atoll(argv[1]); + long long seed = atoll(argv[1]); + auto gen = Random(seed); + + int N = N_MAX; + int Q = Q_MAX; + + Tree tree = Tree::GenerateByTemplateId(gen, id, N); + tree.shuffle_edges(gen); + tree.shuffle_nodes(gen); + + std::vector A(N), B(N - 1), C(N - 1); + for (int i = 0; i < N; i++) A[i] = gen.uniform(A_MIN, MOD - 1); + for (int i = 0; i < N - 1; i++) B[i] = gen.uniform(B_MIN, MOD - 1); + for (int i = 0; i < N - 1; i++) C[i] = gen.uniform(C_MIN, MOD - 1); + + printf("%d %d\n", N, Q); + + for (int i = 0; i < N; i++) { + if (i) printf(" "); + printf("%d", A[i]); + } + printf("\n"); + + vector deg(N); + for (int i = 0; i < N - 1; i++) { + printf("%d %d %d %d\n", tree.edges[i].first, tree.edges[i].second, B[i], C[i]); + deg[tree.edges[i].first]++, deg[tree.edges[i].second]++; + } + + QueryData_degree qd{N, Q, gen, deg}; + qd.print(); + return 0; +} diff --git a/tree/point_set_tree_path_composite_sum_fixed_root/hash.json b/tree/point_set_tree_path_composite_sum_fixed_root/hash.json index 84e3cb3fd..009b48a8c 100644 --- a/tree/point_set_tree_path_composite_sum_fixed_root/hash.json +++ b/tree/point_set_tree_path_composite_sum_fixed_root/hash.json @@ -30,5 +30,25 @@ "typical_tree_max_08.in": "445ed3756cb077ccca6faf0e5f87d3dece1ac331125ea6dc64973277fd23d265", "typical_tree_max_08.out": "8a3c0ae7a592cf84e9415c0985d273d9fc4157d0d5e00665af66277d2fc296f1", "typical_tree_max_09.in": "39083cc7d515178c740ef09c2daf239795d546e2ad68711bd9cf68b6832f7c73", - "typical_tree_max_09.out": "ce8f20fb97d3e32bdd099920ec01208efcdcbf0c612c45fa42a06615303b2ade" + "typical_tree_max_09.out": "ce8f20fb97d3e32bdd099920ec01208efcdcbf0c612c45fa42a06615303b2ade", + "typical_tree_max_degree_00.in": "2ea860bc4e0a333c6ddf1a0db0b0775132fb509988bb5db9fce80cba43e0cde5", + "typical_tree_max_degree_00.out": "02502e151dd326c579755fe7370d4809d931d5cc951c83aa32905ef9cc2e6e76", + "typical_tree_max_degree_01.in": "cff580be31fe4de830a4727234afaef77b5113b0910ebed5c7cd24b76ffbebfd", + "typical_tree_max_degree_01.out": "411fad7b2fd97982534161984012c2401eda72aaa4f1591b138881675c6907f1", + "typical_tree_max_degree_02.in": "d8b2afa09faa3abebf1cb11e8f8f0a6c77ca50247ab7c5ed7ad6d4a6dcce2a04", + "typical_tree_max_degree_02.out": "cdbce26c52300b732c3d2d6e85a1498397401c1ceba4f267692d937dc3c081f6", + "typical_tree_max_degree_03.in": "359f37a98e3cc847aec37a30326f1dffb0e4f952ffd3f7bd5ea8e3aec1dfdb75", + "typical_tree_max_degree_03.out": "953ac6d9ab47be4604bb95d1a8d4cbaea4d91cdf034f19755b7e06b2efa6c54e", + "typical_tree_max_degree_04.in": "387c1ff9ac7f581e8ebbc45cb944baef7857119b299deb701307ab18f2fa68b4", + "typical_tree_max_degree_04.out": "3af2ba87418e05929221a64df3fa92cbd66c8b18ce3638a586be9caefa1f9891", + "typical_tree_max_degree_05.in": "e5855dadcb10d41c78f480736f1297a819ede1e843d01214ec21e2c9d7d46357", + "typical_tree_max_degree_05.out": "24a2835fe81e1a2f2c084a2c26ea051e6ec0cdec4bd3b328e59653d76ad926ea", + "typical_tree_max_degree_06.in": "cb5ae7ae39535f0aad21a0f985ec25904edc2151400d7d5c6708c62fda1506ea", + "typical_tree_max_degree_06.out": "29bf6ef91a5c8184f646b2cf9c50c24d4f188e7919673ab759d11b46c32c0518", + "typical_tree_max_degree_07.in": "e82cddf0c3d15226a93987efe52e363f99a3a439381671979ff20a492a1e2960", + "typical_tree_max_degree_07.out": "c679b76592df3157be8cad7f8a82e97145f0414d54e79a13c52c1c0c1c695375", + "typical_tree_max_degree_08.in": "0fce72542e2170d6b61475cffba03864b5faf1c166c288fc0a2fbdfe9b7e9854", + "typical_tree_max_degree_08.out": "a773c4a42ca7ffd679080f6d495ef66e097237bdb54912116952022fdd55dff7", + "typical_tree_max_degree_09.in": "03637290eaf5e5cb7366170cbd85a78c65effc824252c4ad220b75bfbfd3dcca", + "typical_tree_max_degree_09.out": "6abba5a42c85ce35269a191604471f0b69f11de15c41a9b4cc6c0e6f6db205a1" } \ No newline at end of file diff --git a/tree/point_set_tree_path_composite_sum_fixed_root/info.toml b/tree/point_set_tree_path_composite_sum_fixed_root/info.toml index 53d5d0307..5ca708d3c 100644 --- a/tree/point_set_tree_path_composite_sum_fixed_root/info.toml +++ b/tree/point_set_tree_path_composite_sum_fixed_root/info.toml @@ -14,6 +14,9 @@ forum = "https://github.com/yosupo06/library-checker-problems/issues/1136" [[tests]] name = "typical_tree_max.cpp" number = 10 +[[tests]] + name = "typical_tree_max_degree.cpp" + number = 10 [[solutions]] name = "naive.cpp"