From 2bc8d542880b72a5c66c500f4cbd8bd5f3847b58 Mon Sep 17 00:00:00 2001 From: Ariel Date: Sun, 21 Jan 2024 16:24:57 +0800 Subject: [PATCH] Create sack.cc --- dp/sack.cc | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 dp/sack.cc diff --git a/dp/sack.cc b/dp/sack.cc new file mode 100644 index 0000000..fb7e5cb --- /dev/null +++ b/dp/sack.cc @@ -0,0 +1,70 @@ +#include "../include.hh" + +int main() { + untie; + read(int, n); + adj(ch, n); + for (int i = 0; i < n - 1; ++i) { + read(int, u, v); + edge(ch, u, v); + } + readvec(int, c, n); // WARNING + + + vector size(n + 1); + vector heavy(n + 1); + auto dfs = [&] (auto dfs, int v, int pa) -> int { + size[v] = 1; + for (auto&& u : ch[v]) { + if (u != pa) { + int curr = dfs(dfs, u, v); + size[v] += curr; + if (curr > size[heavy[v]]) heavy[v] = u; + } + } + return size[v]; + }; + dfs(dfs, 1, 0); + + + vector cnt(n + 1); + vector res(n + 1); + auto remove = [&] (auto remove, int v, int pa) -> void { + cnt[c[v-1]] -= 1; + for (auto&& u : ch[v]) if (u != pa) remove(remove, u, v); + }; + auto dfs2 = [&] (auto dfs2, int v, int pa, int update_ans, int write_cnt) -> int { + if (!v) return 0; + if (update_ans) { + for (auto&& u : ch[v]) { + if (u != pa && u != heavy[v]) dfs2(dfs2, u, v, 1, 0); + } + } + int ans = dfs2(dfs2, heavy[v], v, update_ans, 1); + for (auto&& u : ch[v]) { + if (u != pa && u != heavy[v]) ans += dfs2(dfs2, u, v, 0, 1); + } + if (!cnt[c[v-1]]) { + cnt[c[v-1]] = 1; + ++ans; + } else { + cnt[c[v-1]] += 1; + } + // debugvec(cnt); + if (!write_cnt) { + remove(remove, v, pa); + } + if (update_ans) { + res[v] = ans; + } + return ans; + }; + dfs2(dfs2, 1, 0, 1, 1); + + + read(int, m); + while(m--) { + read(int, q); + cout << res[q] << endl; + } +}