「CF1830D」Mex Tree
Description
Link:CF1830D
给出一棵包含 个节点的树。你需要给每个节点染上数字 或 。
路径 的权值,等于从 到 的最短路径上所有节点数字的 MEX。一种染色方案的权值等于所有 的路径 的权值之和。
请求出所有的染色方案中,可能的最大权值。
数据范围:。
时空限制:s / MiB。
Solution
考虑以同色连通块的视角处理此题。注意到横跨至少一个全 连通块与全 连通块的路径 ,全 连通块内的路径 ,全 连通块内的路径 。
于是我们反过来考虑。设一开始所有路径均有 的贡献,对于一个大小为 的全 连通块有 的负贡献,对于一个大小为 的全 连通块有 的负贡献。
一个不成熟的想法是对这棵树进行黑白染色,黑白染色的负贡献 。但有时黑白染色并不是最优的,例如将两个菊花图的中心以一条边相连,此时可以将两个中心染成 ,将叶子染成 。但我们可以通过黑白染色可以进一步约束连通块的大小 ,有 。
故直接考虑 dp,设 表示考虑到了以 为根的子树, 所在的连通块大小为 颜色为 时的最小负贡献。转移很简单 …
时间复杂度 ,但此题还卡了空间复杂度 的实现。
官方给出的解决方案是 [Idea] Using HLD to reduce memory。
18Michael 大佬的解决方案:使用 std::vector 来储存 dp 数组,每次枚举 的子节点 转移之后,将 的 dp 数组进行 clear() 以及 shrink_to_fit()。可以证明空间复杂度是 的(容量不超过 不重要,容量不超过子树大小比较重要)。