1 条题解
-
0
题目大意
有一棵有根树,每个节点可以染成蓝色()、绿色()、黄色()。
一种染色称为美丽的,如果:- 根节点是绿色;
- 所有蓝色和绿色节点构成的点集是连通的(路径上不能出现黄色节点);
- 所有黄色和绿色节点构成的点集是连通的(路径上不能出现蓝色节点)。
给定 ,求顶点数最少的有根树,使得它恰好有 种美丽染色方案。如果不存在这样的树,输出 。
核心观察
关键性质:如果一个节点不是绿色,那么它的整个子树必须染成同一种颜色(全蓝或全黄)。
证明:
假设一个蓝色节点 有一个黄色后代 。从 到根的路径必须经过 ,但 是蓝色,而黄+绿连通性要求路径上不能有蓝色节点,矛盾。同理,蓝色节点不能有绿色后代(因为绿色到根经过蓝色会破坏黄+绿连通性)。所以蓝色节点的子树必须全蓝。对称地,黄色节点的子树必须全黄。
绿色节点无此限制。
正向计数(已知树,求美丽染色数)
设 表示:在以 为根的子树中, 固定为绿色时的美丽染色方案数。
- 若 是叶子(无子节点):。
- 若 有子节点 :
- 每个子节点 可以染成绿、蓝、黄。
- 若染成绿色:有 种方式。
- 若染成蓝色或黄色:整个 子树必须同色,只有 种方式。
- 因此, 的染色方式数为 。
- 各子节点独立,所以:
整棵树的美丽染色数就是 (因为根固定为绿色)。
逆向问题(给定 ,求最少顶点数)
我们要求:构造一棵树,使 ,且顶点数最小。
状态定义(标程中的偏移)
标程中:
- :当 时的最少顶点数。
- :当 且根至少有 2 个子节点时的最少顶点数。
并且输入 时调用 ,输出结果即为顶点数。
验证:- → ,输出 (顶点数 )
- → ,输出
- → ,输出
- → ,输出
- → ,输出
因此 返回的就是顶点数,且 。
所以 对应 时顶点数 (只有根), 是边界占位。
递推关系
情况 1:根只有一个子节点(链状)
此时子节点必须为绿色(否则 固定)。
设子节点的 ,则:顶点数 (因为 对应 时的顶点数)。
标程中体现为:这里 用于多子节点情况,但链情况实际只用 自身,而 的初始值设为 保证了取 min 时正确。
情况 2:根有多个子节点(至少 2 个)
设子节点的 分别为 (),则:
记 ,则 ,。
顶点数 (因为 对应 时的顶点数)。于是定义:
$$dp2[m] = \min_{\substack{m = \prod a_i \\ a_i \ge 3,\ k\ge 2}} \left(1 + \sum_{i=1}^k dp[a_i]\right) $$
计算
对于 的一个因子 ,我们可以拆出一个 ,剩余部分为 。
$$dp2[m] = \min_{d \mid m,\ d \ge 3} \big( dp[d] + dp2[m/d] \big) $$
剩余部分可以继续分解为多个因子(可能不止一个),因此用 递归:同时, 也可取 作为初始值(但 可能对应一个子节点,不满足 ,不过取 min 后会被更优的多子节点方案替代)。
标程中的实现:
dp2[x] = calc(x); for(auto y : divisors[x]) dp2[x] = min(dp2[x], calc(y) + calc2(x / y));即:
$$dp2[x] = \min\left(dp[x],\ \min_{d \mid x,\ d \ge 3} \big( dp[d] + dp2[x/d] \big) \right) $$
综合递推
对于 且 为奇数:
边界:
最后,输入 时:
- 若 为偶数 → 输出
- 否则输出
为什么 必为奇数?
- 叶子节点:(奇数)
- 内部节点:, 是奇数 → 是奇数 → 奇数乘积仍为奇数。
- 所以 总是奇数, 为偶数时无解。
算法步骤
-
预处理因子():
for i = 2 to N-1: for j = 2*i, 3*i, ... < N: divisors[j].push_back(i)复杂度 。
-
动态规划(只计算奇数 ):
- 初始化 , 和 数组其余为 。
- 对每个奇数 从 到 :
- 计算 使用因子列表。
- 计算 。
-
回答查询:
- 读入 ,若 为偶数,输出 。
- 否则输出 。
示例验证
输出 1 3 1 3 5 2 5 7 3 7 9 4 9 11 3 与题目样例完全一致。
复杂度分析
- 预处理因子:
- DP 每个状态遍历其所有因子:总 (调和级数)
- 每个查询
对于 ,完全可行。
总结
本题的核心在于:
- 发现非绿色节点的子树必须单色。
- 推导出 的乘积递推式。
- 将问题转化为对 的因子分解,并用动态规划求最小顶点数。
- 利用预处理因子将复杂度优化到 。
- 1
信息
- ID
- 6551
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者