diff --git a/library/graphs/bcc_callback.hpp b/library/graphs/bcc_callback.hpp index f751b908..0d74de3c 100644 --- a/library/graphs/bcc_callback.hpp +++ b/library/graphs/bcc_callback.hpp @@ -9,8 +9,8 @@ //! int count_edges = 0; //! rep (i, 0, sz(nodes) - 1) { //! seen[nodes[i]] = 1; -//! for (int v : adj[nodes[i]]) if (!seen[v]) { -//! // edge nodes[i] <=> v is in current BCC +//! for (int u : adj[nodes[i]]) if (!seen[u]) { +//! // edge nodes[i] <=> u is in current BCC //! count_edges++; //! } //! } @@ -18,22 +18,22 @@ //! // nodes[0] <=> nodes[1] is a bridge //! return; //! } -//! for (int v : nodes) uf.join(v, nodes[0]); +//! for (int u : nodes) uf.join(u, nodes[0]); //! }); //! vector> bridge_tree(n); //! rep (i, 0, n) -//! for (int v : adj[i]) -//! if (!uf.sameSet(i, v)) -//! bridge_tree[uf.find(i)] += uf.find(v); +//! for (int u : adj[i]) +//! if (!uf.sameSet(i, u)) +//! bridge_tree[uf.find(i)] += uf.find(u); //! } //! //! vector> adj(n); //! vector> block_vertex_tree(2 * n); //! int bcc_id = n; //! bcc_callback(adj, [&](const vi& nodes) { -//! for (int v : nodes) { -//! block_vertex_tree[v] += bcc_id; -//! block_vertex_tree[bcc_id] += v; +//! for (int u : nodes) { +//! block_vertex_tree[u] += bcc_id; +//! block_vertex_tree[bcc_id] += u; //! } //! bcc_id++; //! }); @@ -44,13 +44,13 @@ void bcc_callback(const auto& adj, auto f) { int n = sz(adj), q = 0, s = 0; vi t(n), st(n); - auto dfs = [&](auto&& self, int v) -> int { - int l = t[v] = ++q; - for (int u : adj[v]) { + auto dfs = [&](auto&& self, int u) -> int { + int l = t[u] = ++q; + for (int v : adj[u]) { int siz = s, lu = 0; - l = min(l, t[u] ?: (lu = self(self, st[s++] = u))); - if (lu >= t[v]) { - st[s++] = v; + l = min(l, t[v] ?: (lu = self(self, st[s++] = v))); + if (lu >= t[u]) { + st[s++] = u; f({siz + all(st) - n + s}); s = siz; } diff --git a/library/graphs/hopcroft_karp.hpp b/library/graphs/hopcroft_karp.hpp index 9d504347..bef7262f 100644 --- a/library/graphs/hopcroft_karp.hpp +++ b/library/graphs/hopcroft_karp.hpp @@ -29,31 +29,31 @@ struct hopcroft_karp { mvc_l.assign(lsz, 1); mvc_r.assign(rsz, 0); while (!empty(q)) { - int v = q.front(); + int u = q.front(); q.pop(); - mvc_l[v] = 0; - for (int u : adj[v]) { - mvc_r[u] = 1; - int w = to_l[u]; + mvc_l[u] = 0; + for (int v : adj[u]) { + mvc_r[v] = 1; + int w = to_l[v]; if (w == -1) found = 1; else if (level[w] == -1) { - level[w] = level[v] + 1; + level[w] = level[u] + 1; q.push(w); } } } if (!found) break; - auto dfs = [&](auto&& self, int v) -> bool { - for (int u : adj[v]) { - int w = to_l[u]; + auto dfs = [&](auto&& self, int u) -> bool { + for (int v : adj[u]) { + int w = to_l[v]; if (w == -1 || - (level[v] + 1 == level[w] && self(self, w))) { - to_r[v] = u; - to_l[u] = v; + (level[u] + 1 == level[w] && self(self, w))) { + to_r[u] = v; + to_l[v] = u; return 1; } } - level[v] = INT_MAX; + level[u] = INT_MAX; return 0; }; rep(i, 0, lsz) m_sz += diff --git a/library/graphs/scc.hpp b/library/graphs/scc.hpp index 4691e704..c585a81e 100644 --- a/library/graphs/scc.hpp +++ b/library/graphs/scc.hpp @@ -4,21 +4,21 @@ //! vector> adj(n); //! auto [num_sccs, scc_id] = sccs(adj); //! @endcode -//! scc_id[v] = id, 0<=id v: scc_id[u] >= scc_id[v] //! @time O(n + m) //! @space O(n) auto sccs(const auto& adj) { int n = sz(adj), num_sccs = 0, q = 0, s = 0; vi scc_id(n, -1), tin(n), st(n); - auto dfs = [&](auto&& self, int v) -> int { - int low = tin[v] = ++q; - st[s++] = v; - for (int u : adj[v]) - if (scc_id[u] < 0) - low = min(low, tin[u] ?: self(self, u)); - if (tin[v] == low) { - while (scc_id[v] < 0) scc_id[st[--s]] = num_sccs; + auto dfs = [&](auto&& self, int u) -> int { + int low = tin[u] = ++q; + st[s++] = u; + for (int v : adj[u]) + if (scc_id[v] < 0) + low = min(low, tin[v] ?: self(self, v)); + if (tin[u] == low) { + while (scc_id[u] < 0) scc_id[st[--s]] = num_sccs; num_sccs++; } return low; diff --git a/library/graphs/strongly_connected_components/add_edges_strongly_connected.hpp b/library/graphs/strongly_connected_components/add_edges_strongly_connected.hpp index c4d56556..0bf5897c 100644 --- a/library/graphs/strongly_connected_components/add_edges_strongly_connected.hpp +++ b/library/graphs/strongly_connected_components/add_edges_strongly_connected.hpp @@ -23,18 +23,18 @@ vector extra_edges(const auto& adj, int num_sccs, int n = sz(adj); vector scc_adj(num_sccs); vector zero_in(num_sccs, 1); - rep(i, 0, n) for (int u : adj[i]) { - if (scc_id[i] == scc_id[u]) continue; - scc_adj[scc_id[i]].push_back(scc_id[u]); - zero_in[scc_id[u]] = 0; + rep(i, 0, n) for (int v : adj[i]) { + if (scc_id[i] == scc_id[v]) continue; + scc_adj[scc_id[i]].push_back(scc_id[v]); + zero_in[scc_id[v]] = 0; } vector vis(num_sccs); - auto dfs = [&](auto&& self, int v) { - if (empty(scc_adj[v])) return v; - for (int u : scc_adj[v]) - if (!vis[u]) { - vis[u] = 1; - int zero_out = self(self, u); + auto dfs = [&](auto&& self, int u) { + if (empty(scc_adj[u])) return u; + for (int v : scc_adj[u]) + if (!vis[v]) { + vis[v] = 1; + int zero_out = self(self, v); if (zero_out != -1) return zero_out; } return -1; @@ -55,7 +55,7 @@ vector extra_edges(const auto& adj, int num_sccs, in_unused.pop_back(); } else edges.emplace_back(i, num_sccs - 1); } - for (int v : in_unused) edges.emplace_back(0, v); + for (int u : in_unused) edges.emplace_back(0, u); vi to_node(num_sccs); rep(i, 0, n) to_node[scc_id[i]] = i; for (auto& [u, v] : edges) diff --git a/library/graphs/uncommon/bridges.hpp b/library/graphs/uncommon/bridges.hpp index 5b2ddcb5..b7ab1cc2 100644 --- a/library/graphs/uncommon/bridges.hpp +++ b/library/graphs/uncommon/bridges.hpp @@ -18,15 +18,15 @@ auto bridges(const auto& adj, int m) { int n = sz(adj), num_ccs = 0, q = 0, s = 0; vi br_id(n, -1), is_br(m), tin(n), st(n); - auto dfs = [&](auto&& self, int v, int p) -> int { - int low = tin[v] = ++q; - st[s++] = v; - for (auto [u, e] : adj[v]) - if (e != p && br_id[u] < 0) - low = min(low, tin[u] ?: self(self, u, e)); - if (tin[v] == low) { + auto dfs = [&](auto&& self, int u, int p) -> int { + int low = tin[u] = ++q; + st[s++] = u; + for (auto [v, e] : adj[u]) + if (e != p && br_id[v] < 0) + low = min(low, tin[v] ?: self(self, v, e)); + if (tin[u] == low) { if (p != -1) is_br[p] = 1; - while (br_id[v] < 0) br_id[st[--s]] = num_ccs; + while (br_id[u] < 0) br_id[st[--s]] = num_ccs; num_ccs++; } return low; diff --git a/library/graphs/uncommon/cuts.hpp b/library/graphs/uncommon/cuts.hpp index 1f7068a0..103c19a5 100644 --- a/library/graphs/uncommon/cuts.hpp +++ b/library/graphs/uncommon/cuts.hpp @@ -19,16 +19,16 @@ auto cuts(const auto& adj, int m) { int n = sz(adj), num_bccs = 0, q = 0, s = 0; vi bcc_id(m, -1), is_cut(n), tin(n), st(m); - auto dfs = [&](auto&& self, int v, int p) -> int { - int low = tin[v] = ++q; - for (auto [u, e] : adj[v]) { - assert(v != u); + auto dfs = [&](auto&& self, int u, int p) -> int { + int low = tin[u] = ++q; + for (auto [v, e] : adj[u]) { + assert(u != v); if (e == p) continue; - if (tin[u] < tin[v]) st[s++] = e; + if (tin[v] < tin[u]) st[s++] = e; int lu = -1; - low = min(low, tin[u] ?: (lu = self(self, u, e))); - if (lu >= tin[v]) { - is_cut[v] = p >= 0 || tin[v] + 1 < tin[u]; + low = min(low, tin[v] ?: (lu = self(self, v, e))); + if (lu >= tin[u]) { + is_cut[u] = p >= 0 || tin[u] + 1 < tin[v]; while (bcc_id[e] < 0) bcc_id[st[--s]] = num_bccs; num_bccs++; } diff --git a/library/trees/hld.hpp b/library/trees/hld.hpp index aaae48b6..50524362 100644 --- a/library/trees/hld.hpp +++ b/library/trees/hld.hpp @@ -5,7 +5,7 @@ //! HLD<0> hld(adj); //! hld.path(u, v, [&](int l, int r) { // [l, r) //! }); -//! auto [l, r] = hld.subtree(v); // [l, r) +//! auto [l, r] = hld.subtree(u); // [l, r) //! @endcode //! @time O(n + q log^2 n) //! @space O(n) @@ -15,23 +15,23 @@ template struct HLD { vi p, siz, rt, tin; HLD(auto& adj): n(sz(adj)), p(n), siz(n, 1), rt(n), tin(n) { - auto dfs1 = [&](auto&& self, int v) -> void { - for (int& u : adj[v]) { - iter_swap(ranges::find(adj[u], v), rbegin(adj[u])); - adj[u].pop_back(); - p[u] = v; - self(self, u); - siz[v] += siz[u]; - if (siz[u] > siz[adj[v][0]]) swap(u, adj[v][0]); + auto dfs1 = [&](auto&& self, int u) -> void { + for (int& v : adj[u]) { + iter_swap(ranges::find(adj[v], u), rbegin(adj[v])); + adj[v].pop_back(); + p[v] = u; + self(self, v); + siz[u] += siz[v]; + if (siz[v] > siz[adj[u][0]]) swap(v, adj[u][0]); } }; dfs1(dfs1, 0); int tim = 0; - auto dfs2 = [&](auto&& self, int v) -> void { - tin[v] = tim++; - for (int u : adj[v]) { - rt[u] = (u == adj[v][0] ? rt[v] : u); - self(self, u); + auto dfs2 = [&](auto&& self, int u) -> void { + tin[u] = tim++; + for (int v : adj[u]) { + rt[v] = (v == adj[u][0] ? rt[u] : v); + self(self, v); } }; dfs2(dfs2, 0); @@ -44,7 +44,7 @@ template struct HLD { } f(tin[u] + VALS_EDGES, tin[v] + 1); } - pii subtree(int v) { - return {tin[v] + VALS_EDGES, tin[v] + siz[v]}; + pii subtree(int u) { + return {tin[u] + VALS_EDGES, tin[u] + siz[u]}; } }; diff --git a/library/trees/lca_rmq.hpp b/library/trees/lca_rmq.hpp index 5db4bd4b..9a2c325b 100644 --- a/library/trees/lca_rmq.hpp +++ b/library/trees/lca_rmq.hpp @@ -16,12 +16,12 @@ struct LCA { LCA(const auto& adj): n(sz(adj)), tin(n), siz(n, 1), d(n), p(n) { vi order; - auto dfs = [&](auto&& self, int v) -> void { - tin[v] = sz(order), order.push_back(v); - for (int u : adj[v]) - if (u != p[v]) - d[u] = d[p[u] = v] + 1, self(self, u), - siz[v] += siz[u]; + auto dfs = [&](auto&& self, int u) -> void { + tin[u] = sz(order), order.push_back(u); + for (int v : adj[u]) + if (v != p[u]) + d[v] = d[p[v] = u] + 1, self(self, v), + siz[u] += siz[v]; }; dfs(dfs, 0); rmq = {order, diff --git a/library/trees/linear_kth_par.hpp b/library/trees/linear_kth_par.hpp index 267fc998..e2254892 100644 --- a/library/trees/linear_kth_par.hpp +++ b/library/trees/linear_kth_par.hpp @@ -21,28 +21,28 @@ template struct linear_kth_par { jmp[t] = st[max(0, s - KAPPA * (t & -t))]; t++; }; - auto dfs = [&](auto&& self, int v, int p) -> void { - int& l = leaf[v] = st[d[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[l] < d[leaf[u]]) l = leaf[u]; - calc(d[v]); + auto dfs = [&](auto&& self, int u, int p) -> void { + int& l = leaf[u] = st[d[u]] = u; + pos[u] = t; + calc(d[u]); + for (int v : adj[u]) + if (v != p) { + d[v] = 1 + d[u]; + self(self, v, u); + if (d[l] < d[leaf[v]]) l = leaf[v]; + calc(d[u]); } - int s = (d[l] - d[v]) * (2 * KAPPA + 3) / KAPPA; + int s = (d[l] - d[u]) * (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); } - int kth_par(int v, int k) { - assert(0 <= k && k <= d[v]); - int anc_d = d[v] - k; + int kth_par(int u, int k) { + assert(0 <= k && k <= d[u]); + int anc_d = d[u] - k; if (unsigned j = k / (KAPPA + 1); j) - j = bit_floor(j), v = jmp[(pos[v] & -j) | j]; - return v = leaf[v], lad[v][d[v] - anc_d]; + j = bit_floor(j), u = jmp[(pos[u] & -j) | j]; + return u = leaf[u], lad[u][d[u] - anc_d]; } }; diff --git a/library/trees/linear_lca.hpp b/library/trees/linear_lca.hpp index d315c641..49fad5c2 100644 --- a/library/trees/linear_lca.hpp +++ b/library/trees/linear_lca.hpp @@ -13,19 +13,19 @@ struct linear_lca { linear_lca(const auto& adj): n(sz(adj)), d(n), in(n), asc(n), head(n + 1) { vector order; - auto dfs = [&](auto&& self, int v, int p) -> void { - order.emplace_back(v, p); - in[v] = sz(order); - for (int u : adj[v]) - if (u != p) { - d[u] = 1 + d[v]; - self(self, u, v); - head[in[u]] = v; - if (lsb(in[v]) < lsb(in[u])) in[v] = in[u]; + auto dfs = [&](auto&& self, int u, int p) -> void { + order.emplace_back(u, p); + in[u] = sz(order); + for (int v : adj[u]) + if (v != p) { + d[v] = 1 + d[u]; + self(self, v, u); + head[in[v]] = u; + if (lsb(in[u]) < lsb(in[v])) in[u] = in[v]; } }; dfs(dfs, 0, 0); - for (auto [v, p] : order) asc[v] = asc[p] | lsb(in[v]); + for (auto [u, p] : order) asc[u] = asc[p] | lsb(in[u]); } int lca(int u, int v) { if (unsigned j = in[u] ^ in[v]; j) { diff --git a/library/trees/shallowest_decomp_tree.hpp b/library/trees/shallowest_decomp_tree.hpp index 8256982c..c9e0ceab 100644 --- a/library/trees/shallowest_decomp_tree.hpp +++ b/library/trees/shallowest_decomp_tree.hpp @@ -9,23 +9,23 @@ //! @space O(n) void shallowest(auto& adj, auto f) { vector order(bit_width(size(adj))); - auto dfs = [&](auto&& self, int v, int p) -> int { + auto dfs = [&](auto&& self, int u, int p) -> int { int once = 0, twice = 0; - for (int u : adj[v]) - if (u != p) { - int dp = self(self, u, v); + for (int v : adj[u]) + if (v != p) { + int dp = self(self, v, u); twice |= once & dp, once |= dp; } auto dp = (once | (bit_ceil(twice + 1u) - 1)) + 1; - order[countr_zero(dp)].push_back(v); + order[countr_zero(dp)].push_back(u); return dp; }; dfs(dfs, 0, 0); for (const vi& vec : order | views::reverse) - for (int v : vec) { - f(v); - for (int u : adj[v]) - iter_swap(ranges::find(adj[u], v), rbegin(adj[u])), - adj[u].pop_back(); + for (int u : vec) { + f(u); + for (int v : adj[u]) + iter_swap(ranges::find(adj[v], u), rbegin(adj[v])), + adj[v].pop_back(); } } diff --git a/library/trees/tree_lift.hpp b/library/trees/tree_lift.hpp index 3a6e574b..08e1e00a 100644 --- a/library/trees/tree_lift.hpp +++ b/library/trees/tree_lift.hpp @@ -11,20 +11,20 @@ struct tree_lift { vi d, p, j; tree_lift(const auto& adj): d(sz(adj)), p(d), j(d) { - auto dfs = [&](auto&& self, int v) -> void { + auto dfs = [&](auto&& self, int u) -> void { int up = - d[v] + d[j[j[v]]] == 2 * d[j[v]] ? j[j[v]] : v; - for (int u : adj[v]) - if (u != p[v]) - d[u] = d[p[u] = v] + 1, j[u] = up, self(self, u); + d[u] + d[j[j[u]]] == 2 * d[j[u]] ? j[j[u]] : u; + for (int v : adj[u]) + if (v != p[u]) + d[v] = d[p[v] = u] + 1, j[v] = up, self(self, v); }; dfs(dfs, 0); } - int kth_par(int v, int k) { - int anc_d = d[v] - k; - while (d[v] > anc_d) - v = d[j[v]] >= anc_d ? j[v] : p[v]; - return v; + int kth_par(int u, int k) { + int anc_d = d[u] - k; + while (d[u] > anc_d) + u = d[j[u]] >= anc_d ? j[u] : p[u]; + return u; } int lca(int u, int v) { if (d[u] < d[v]) swap(u, v); diff --git a/library/trees/uncommon/contour_range_query.hpp b/library/trees/uncommon/contour_range_query.hpp index 4e5d8b80..e2bf71fc 100644 --- a/library/trees/uncommon/contour_range_query.hpp +++ b/library/trees/uncommon/contour_range_query.hpp @@ -9,7 +9,7 @@ struct contour_range_query { vector>> info; vector> bits; //! @param adj unrooted, undirected tree - //! @param a a[v] = initial number for node v + //! @param a a[u] = initial number for node u //! @time O(n logφ n) //! @space O(n logφ n) for `info` and `bits` contour_range_query(const vector& adj, @@ -18,41 +18,40 @@ struct contour_range_query { edge_cd(adj, [&](const vector& cd_adj, int cent, int split) { vector> sum_num(2, vector(1)); - auto dfs = [&](auto&& self, int v, int p, int d, + auto dfs = [&](auto&& self, int u, int p, int d, int side) -> void { - info[v].push_back({int(sz(bits)), d, side}); + info[u].push_back({int(sz(bits)), d, side}); if (sz(sum_num[side]) == d) sum_num[side].push_back(0); - sum_num[side][d] += a[v]; - for (int u : cd_adj[v]) - if (u != p) self(self, u, v, 1 + d, side); + sum_num[side][d] += a[u]; + for (int c : cd_adj[u]) + if (c != p) self(self, c, u, 1 + d, side); }; rep(i, 0, sz(cd_adj[cent])) dfs(dfs, cd_adj[cent][i], cent, 1, i < split); bits.push_back({BIT(sum_num[0]), BIT(sum_num[1])}); }); } - //! @param v node - //! @param delta number to add to node v's number + //! @param u node + //! @param delta number to add to node u's number //! @time O(logφ(n) * log2(n)) //! @space O(1) - void update(int v, ll delta) { - sum_a.update(v, delta); - for (auto [decomp, d, side] : info[v]) + void update(int u, ll delta) { + sum_a.update(u, delta); + for (auto [decomp, d, side] : info[u]) bits[decomp][side].update(d, delta); } - //! @param v node + //! @param u node //! @param l,r defines range [l, r) - //! @returns sum of node u's number over all u such that - //! l - //! <= dist_edges(u, v) < r + //! @returns sum of node v's number over all v such that + //! l <= dist(u, v) < r //! @time O(logφ(n) * log2(n)) //! @space O(1) - ll query(int v, int l, int r) { + ll query(int u, int l, int r) { ll sum = 0; - if (l <= 0 && 0 < r) sum += sum_a.sum[v]; - if (l <= 1 && 1 < r) sum += sum_a.query(v); - for (auto [decomp, d, side] : info[v]) { + if (l <= 0 && 0 < r) sum += sum_a.sum[u]; + if (l <= 1 && 1 < r) sum += sum_a.query(u); + for (auto [decomp, d, side] : info[u]) { auto& bit = bits[decomp][!side]; int my_l = clamp(l - d, 1, sz(bit.s)); int my_r = clamp(r - d, 1, sz(bit.s)); diff --git a/library/trees/uncommon/contour_range_update.hpp b/library/trees/uncommon/contour_range_update.hpp index c7972172..80f7bf1f 100644 --- a/library/trees/uncommon/contour_range_update.hpp +++ b/library/trees/uncommon/contour_range_update.hpp @@ -10,7 +10,7 @@ struct contour_range_update { vector>> info; vector> bits; //! @param adj unrooted, undirected tree - //! @param a a[v] = initial number for node v + //! @param a a[u] = initial number for node u //! @time O(n logφ n) //! @space O(n logφ n) for `info` and `bits` contour_range_update(const vector& adj, @@ -19,12 +19,12 @@ struct contour_range_update { edge_cd(adj, [&](const vector& cd_adj, int cent, int split) { array mx_d = {0, 0}; - auto dfs = [&](auto&& self, int v, int p, int d, + auto dfs = [&](auto&& self, int u, int p, int d, int side) -> void { mx_d[side] = max(mx_d[side], d); - info[v].push_back({int(sz(bits)), d, side}); - for (int u : cd_adj[v]) - if (u != p) self(self, u, v, 1 + d, side); + info[u].push_back({int(sz(bits)), d, side}); + for (int v : cd_adj[u]) + if (v != p) self(self, v, u, 1 + d, side); }; rep(i, 0, sz(cd_adj[cent])) dfs(dfs, cd_adj[cent][i], cent, 1, i < split); @@ -32,27 +32,27 @@ struct contour_range_update { {bit_rupq(mx_d[0] + 1), bit_rupq(mx_d[1] + 1)}); }); } - //! @param v,l,r,delta add delta to all nodes u such - //! that l <= dist_edges(v, u) < r + //! @param u,l,r,delta add delta to all nodes v such + //! that l <= dist(u, v) < r //! @time O(logφ(n) * log2(n)) //! @space O(1) - void update(int v, int l, int r, ll delta) { - if (l <= 0 && 0 < r) a[v] += delta; - if (l <= 1 && 1 < r) sum_a.update(v, delta); - for (auto [decomp_id, d, side] : info[v]) { + void update(int u, int l, int r, ll delta) { + if (l <= 0 && 0 < r) a[u] += delta; + if (l <= 1 && 1 < r) sum_a.update(u, delta); + for (auto [decomp_id, d, side] : info[u]) { auto& bit = bits[decomp_id][!side]; int my_l = clamp(l - d, 1, bit.n); int my_r = clamp(r - d, 1, bit.n); bit.update(my_l, my_r, delta); } } - //! @param v node - //! @returns number of node v + //! @param u node + //! @returns number of node u //! @time O(logφ(n) * log2(n)) //! @space O(1) - ll query(int v) { - ll sum = a[v] + sum_a.query(v); - for (auto [decomp_id, d, side] : info[v]) + ll query(int u) { + ll sum = a[u] + sum_a.query(u); + for (auto [decomp_id, d, side] : info[u]) sum += bits[decomp_id][side].get_index(d); return sum; } diff --git a/library/trees/uncommon/count_paths_per_length.hpp b/library/trees/uncommon/count_paths_per_length.hpp index b98e0145..f1aec47a 100644 --- a/library/trees/uncommon/count_paths_per_length.hpp +++ b/library/trees/uncommon/count_paths_per_length.hpp @@ -13,12 +13,12 @@ vector count_paths_per_length(const vector& adj) { edge_cd(adj, [&](const vector& cd_adj, int cent, int split) { vector> cnt(2, vector(1)); - auto dfs = [&](auto&& self, int v, int p, int d, + auto dfs = [&](auto&& self, int u, int p, int d, int side) -> void { if (sz(cnt[side]) == d) cnt[side].push_back(0.0); cnt[side][d]++; - for (int u : cd_adj[v]) - if (u != p) self(self, u, v, 1 + d, side); + for (int c : cd_adj[u]) + if (c != p) self(self, c, u, 1 + d, side); }; rep(i, 0, sz(cd_adj[cent])) dfs(dfs, cd_adj[cent][i], cent, 1, i < split); diff --git a/library/trees/uncommon/count_paths_per_node.hpp b/library/trees/uncommon/count_paths_per_node.hpp index 9f96ca1c..21f7db17 100644 --- a/library/trees/uncommon/count_paths_per_node.hpp +++ b/library/trees/uncommon/count_paths_per_node.hpp @@ -14,16 +14,16 @@ vector count_paths_per_node(const vector& adj, centroid(adj, [&](const vector& cd_adj, int cent, int) { vector pre_d{1}, cur_d{0}; - auto dfs = [&](auto&& self, int v, int p, + auto dfs = [&](auto&& self, int u, int p, int d) -> ll { if (d > k) return 0LL; if (sz(cur_d) <= d) cur_d.push_back(0); cur_d[d]++; ll cnt = 0; if (k - d < sz(pre_d)) cnt += pre_d[k - d]; - for (int u : cd_adj[v]) - if (u != p) cnt += self(self, u, v, d + 1); - num_paths[v] += cnt; + for (int c : cd_adj[u]) + if (c != p) cnt += self(self, c, u, d + 1); + num_paths[u] += cnt; return cnt; }; auto dfs_child = [&](int child) -> ll { diff --git a/library/trees/uncommon/ladder_decomposition.hpp b/library/trees/uncommon/ladder_decomposition.hpp index 945d44aa..e0cb355a 100644 --- a/library/trees/uncommon/ladder_decomposition.hpp +++ b/library/trees/uncommon/ladder_decomposition.hpp @@ -5,7 +5,7 @@ //! @code //! ladder ld(adj); //! // KACTL functions -//! int kth_par = jmp(ld.jmp, v, k); +//! int kth_par = jmp(ld.jmp, u, k); //! int curr_lca = lca(ld.jmp, ld.d, u, v); //! @endcode struct ladder { @@ -17,13 +17,13 @@ struct ladder { //! @space O(n log n) for jmp. Everything else is O(n) ladder(const auto& adj): n(sz(adj)), d(n), p(n), leaf(n), idx(n), lad(2 * n) { - auto dfs = [&](auto&& self, int v) -> void { - leaf[v] = v; - for (int u : adj[v]) - if (u != p[v]) { - d[u] = d[p[u] = v] + 1; - self(self, u); - if (d[leaf[v]] < d[leaf[u]]) leaf[v] = leaf[u]; + auto dfs = [&](auto&& self, int u) -> void { + leaf[u] = u; + for (int v : adj[u]) + if (v != p[u]) { + d[v] = d[p[v] = u] + 1; + self(self, v); + if (d[leaf[u]] < d[leaf[v]]) leaf[u] = leaf[v]; } }; dfs(dfs, 0); @@ -36,19 +36,19 @@ struct ladder { } jmp = treeJump(p); } - //! @param v query node + //! @param u query node //! @param k number of edges - //! @returns a node k edges up from v. With k=1, this - //! returns v's parent. + //! @returns a node k edges up from u. With k=1, this + //! returns u's parent. //! @time O(1) //! @space O(1) - int kth_par(int v, int k) { - assert(0 <= k && k <= d[v]); - if (k == 0) return v; + int kth_par(int u, int k) { + assert(0 <= k && k <= d[u]); + if (k == 0) return u; int bit = __lg(k); - v = jmp[bit][v], k -= (1 << bit); - int l = idx[leaf[v]] + d[leaf[v]] - d[v]; - assert(lad[l] == v); + u = jmp[bit][u], k -= (1 << bit); + int l = idx[leaf[u]] + d[leaf[u]] - d[u]; + assert(lad[l] == u); // subarray [l, l+k] of lad corresponds to the rest // of the jump return lad[l + k]; diff --git a/library/trees/uncommon/subtree_isomorphism.hpp b/library/trees/uncommon/subtree_isomorphism.hpp index 784421f3..88ae9f8d 100644 --- a/library/trees/uncommon/subtree_isomorphism.hpp +++ b/library/trees/uncommon/subtree_isomorphism.hpp @@ -12,12 +12,12 @@ auto subtree_iso(const auto& adj) { vi iso_id(sz(adj), -1); map hashes; - auto dfs = [&](auto&& self, int v, int p) -> int { + auto dfs = [&](auto&& self, int u, int p) -> int { vi ch_ids; - for (int u : adj[v]) - if (u != p) ch_ids.push_back(self(self, u, v)); + for (int v : adj[u]) + if (v != p) ch_ids.push_back(self(self, v, u)); ranges::sort(ch_ids); - return iso_id[v] = + return iso_id[u] = hashes.try_emplace(ch_ids, sz(hashes)) .first->second; }; diff --git a/library/trees/uncommon/sum_adjacent.hpp b/library/trees/uncommon/sum_adjacent.hpp index f54c3d00..623e5562 100644 --- a/library/trees/uncommon/sum_adjacent.hpp +++ b/library/trees/uncommon/sum_adjacent.hpp @@ -6,32 +6,32 @@ struct sum_adj { vector sum, sum_ch; vi p; //! @param adj undirected, unrooted tree - //! @param sum sum[v] = initial number for node v + //! @param sum sum[u] = initial number for node u //! @time O(n) //! @space various O(n) vectors are allocated; recursion //! stack for dfs is O(n) sum_adj(const vector& adj, const vector& sum): n(sz(sum)), sum(sum), sum_ch(n), p(n, -1) { - auto dfs = [&](auto&& self, int v) -> void { - for (int u : adj[v]) - if (u != p[v]) - p[u] = v, sum_ch[v] += sum[u], self(self, u); + auto dfs = [&](auto&& self, int u) -> void { + for (int c : adj[u]) + if (c != p[u]) + p[c] = u, sum_ch[u] += sum[c], self(self, c); }; dfs(dfs, 0); } - //! @param v node + //! @param u node //! @param delta number to add //! @time O(1) //! @space O(1) - void update(int v, ll delta) { - sum[v] += delta; - if (p[v] != -1) sum_ch[p[v]] += delta; + void update(int u, ll delta) { + sum[u] += delta; + if (p[u] != -1) sum_ch[p[u]] += delta; } - //! @param v node - //! @returns sum of v's neighbors numbers + //! @param u node + //! @returns sum of u's neighbors numbers //! @time O(1) //! @space O(1) - ll query(int v) { - return sum_ch[v] + (p[v] != -1 ? sum[p[v]] : 0); + ll query(int u) { + return sum_ch[u] + (p[u] != -1 ? sum[p[u]] : 0); } };