1 条题解
-
0
「ZJOI2022」深搜 题解
题目大意
给定一棵有根树,每个节点有权值。定义 为从节点 出发,使用随机DFS(在每个节点等概率随机选择子节点访问顺序)寻找节点 时,访问路径上所有节点权值最小值的期望。
要求计算所有合法点对 ( 在 的子树中)的 之和,结果对 取模。
算法思路
核心观察
-
期望线性性:可以将问题转化为计算每个节点 作为路径最小值对答案的贡献。
-
DFS随机性:从 到 的DFS路径由随机选择决定,需要计算各种路径出现的概率。
-
树形结构:利用树的递归性质,可以自底向上计算贡献。
关键步骤
1. 问题转化
对于节点 ,考虑它在哪些点对 的DFS路径上成为最小值:
- 必须在 到 的DFS路径上
- 必须是该路径上权值最小的节点(如有多个最小值, 是第一个遇到的)
- 从 到 的路径上不能有权值比 小的节点
2. 概率分析
设从节点 开始,在访问某个特定子节点 之前不遇到比 权值小的节点的概率为 。
这个概率的计算需要考虑:
- 的所有子节点中,哪些子树的最小值比 小
- 随机选择访问顺序时,选择 分支的概率
- 在其他分支中不遇到更小值的概率
3. 状态设计
定义状态 表示一个子树的三个关键信息:
- :该子树对所有包含根节点的点对的贡献和
- :从该子树根节点开始,在DFS过程中不遇到比父节点更小值的概率
- :该子树中的最小权值
4. 状态转移
对于节点 :
-
叶子节点:直接返回
-
内部节点:
- 收集所有子节点的状态信息
- 按子树最小值排序,便于概率计算
- 计算 自身作为最小值的贡献
- 合并子树的贡献,考虑访问顺序的概率
5. 概率计算技巧
- 前缀/后缀概率积:预处理概率乘积,优化计算
- 模逆元:使用费马小定理处理除法取模
- 分类讨论:根据子树最小值与当前节点权值的关系,采用不同的计算方法
算法流程
-
预处理:读入数据,建立树的邻接表表示
-
DFS遍历:从根节点开始,后序遍历整棵树
- 对每个节点,收集子节点信息
- 按子树最小值排序
- 计算当前节点对答案的贡献
- 返回给父节点的状态信息
-
贡献统计:在DFS过程中累加每个节点的贡献到最终答案
复杂度分析
- 时间复杂度:,主要来自对子节点按最小值排序
- 空间复杂度:,存储树结构和临时数组
实现细节
-
模运算:所有运算在模 下进行,使用预先计算的逆元
-
边界处理:
- 单节点树的特殊情况
- 权值相等时的处理(第一个遇到的作为最小值)
-
优化技巧:
- 输入输出优化
- 避免重复计算
- 合理使用数据结构
总结
本题是一道结合了树形结构、概率期望和动态规划的综合性题目,需要深入理解DFS的随机过程,并通过巧妙的概率分析和状态设计来解决问题。核心在于将复杂的期望计算分解为每个节点的独立贡献,利用树的递归性质自底向上求解。
该解法能够在题目限制内高效处理最大规模数据,是解决此类概率期望树问题的典型方法。
-
- 1
信息
- ID
- 3112
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 7
- 已通过
- 1
- 上传者