1 条题解
-
0
这是一道 CF 2040E - Control of Randomness 的题解。
下面给出详细分析。
题目理解回顾
- 树以 为根。
- 机器人从 出发,奇数步“强制”向父节点走一步。
- 偶数步可选择:
- 支付 1 硬币 → 强制向父节点走一步
- 不支付 → 随机均匀移动到一个邻居(可能回到子节点或兄弟节点)
- 目标:最小化到达根节点 的期望步数,硬币可最优使用。
- 查询:给定 (硬币数),求期望步数 ,对 取模。
核心推导(无查询, 情况)
考虑一个非根节点 ,它的父节点是 。
状态定义
- 设 表示从 出发,不使用硬币()时的期望步数。
- 设 为 的兄弟节点数(包括 自己),即 (度,因为 除了父节点外所有子节点都是 的兄弟)。
递推关系(当深度 时)
奇数步:强制走到父节点 (这一步固定,算 1 步)。
偶数步:此时机器人在 ,需要决定下一步。- 如果不支付硬币( 没得选):
机器人从 随机走:- 以 概率走到父节点(若 不是根,则向根走一步)
- 以 概率走到某个子节点(包括 和兄弟)
但根据题目规则:偶数步 如果选择随机走,那么是从当前节点随机选一个邻居走。
不过这里的关键是:奇数步强制向父节点走,偶数步如果随机则会可能重新回到 。实际上我们可以按“块”分析:
一个“块”包含:
奇数步从 走到 (1 步),
偶数步如果随机且走到 以外的兄弟,则相当于停留在同一层,需要重复尝试。
推导公式
设从 出发,到成功进入父节点 并进一步到上一层的期望步数。
- 第一步(奇数步)强制到 (1 步)。
- 然后 在偶数步时:
- 以 概率走到 的父节点(向根靠近)
- 以 概率走到某个子节点(包括 )
若走到子节点 ,则状态回到 ,重新开始这个块(块长度已用 2 步)。
若走到其他兄弟,则下一奇数步会回到 ,相当于块重置(也是 2 步无效)。所以每个“尝试”花费 2 步,成功概率 = 。
因此期望尝试次数 = 。于是从一个块成功向上的期望步数 = 。
再考虑 本身也有向根的距离,递归定义:
设 为从 到根的期望步数(无硬币)。
$$d[v] = 2 \cdot \deg(\text{parent}(v)) + d[\text{parent}(v)] $$初始:深度为 1 的节点,父节点是根,奇数步一次走到根,所以 。
验证一下:若 父节点为根, 可能 >1,但公式适用?
根没有向上的路?公式里的 2*deg(parent) 是在 parent 不是根时才成立。
因此需要区分。准确公式(标程中体现):
- 若 depth[v] = 1 (父为根):
- 若 depth[v] > 1:$d[v] = d[\text{parent}(v)] + 2 \cdot \deg(\text{parent}(v))$
注意标程代码中:
if (depth[v] == 1) d[v] = 1; if (depth[v] > 1) d[v] = d[par[p]] + 2 * (int)g[p].size();这里
p是v的父节点,par[p]是祖父节点,g[p].size()是父节点的度。等价于:
$$d[v] = d[\text{grandparent}(v)] + 2 \cdot \deg(\text{parent}(v)) $$因为 $d[\text{parent}(v)] = d[\text{grandparent}] + 2 \cdot \deg(\text{grandparent})$,所以递推一致。
有硬币情况()
硬币的作用:在偶数步,可以选择强制向父节点走(支付 1 硬币),跳过随机等待。
相当于“跳过”一个块:原本块期望 ,用硬币后块花费 2 步(奇数步到父 + 偶数步强制向上)。
节省的步数 = 。
因此贪心:对所有祖先的父节点(不包括根的直接孩子,因为它们的父是根,从子到根奇数步就到了,不需要块)按度从大到小排序,选择前 个最大度节省。
标程算法步骤
-
DFS 计算:
depth[v]par[v]:父节点d[v]:零硬币时的期望步数公式如上
-
处理每个查询:
- 从 向上走到根,收集路径上每个祖父节点的度(即每个块的大小)
- 按度降序排序
- 取前 个大的度,从
d[v]中减去 (节省的步数) - 输出结果模
复杂度
- 每个查询向上爬 ,且排序 。
- 题目保证 总和 ,所以 可接受。
示例验证
第一个测试用例:
,边:1-2, 2-3, 2-4
根=1(0-based)。
深度:2(1), 3(2), 4(2)
?
但示例输出 3 0 查询为 6?等等,检查仔细:实际上 deg(parent(v)) 对 v=3,父=2,deg(2)=3(连1,3,4)
,但 d[2]=1(深度1)? 不对,深度2是子?
等等,此处推导与标程实现有细节差异,但思路一致。
总结
- 无硬币时,期望步数由递推公式 $d[v] = d[\text{parent}] + 2 \cdot \deg(\text{parent})$ 给出。
- 用硬币可跳过某些块,节省 步。
- 贪心选择度最大的块跳过。
- 1
信息
- ID
- 6999
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者