1 条题解
-
0
题目理解
我们有一棵 个节点的有根树(根为 ),每个节点 有一个权值 。
给定一个长度为 的数组 ,构造一个 的矩阵 ,其中:
即矩阵的 位置的元素是 与 的**最近公共祖先(LCA)**的权值。
要求计算矩阵 的行列式,并对 取模。
样例分析
样例 1
输入:
3 2 1 2 3 2 3 1 2 1 3- 节点 1 权值 ,节点 2 权值 ,节点 3 权值
- 树:1 是根,2 和 3 是 1 的孩子
矩阵 :
行列式 。
输出:
5
矩阵性质与关键转化
矩阵 是对称矩阵,因为 。
更重要的结构是:这个矩阵可以写成若干秩 1 矩阵的和。
考虑每个节点 对矩阵的贡献。定义向量 长度为 :
$$(x_u)_i = \begin{cases} 1 & \text{如果 } u \text{ 是 } A_i \text{ 的祖先} \\ 0 & \text{否则} \end{cases} $$那么:
其中 是外积,得到一个 矩阵。
行列式的简洁表达式
对于这种 LCA 矩阵,存在一个已知结论:
令 为 中所有点以及它们两两 LCA 构成的集合(即虚树节点集合)。将 中点按 DFS 序排序。
那么:
$$\det(B) = \prod_{u \in T} v_u^{c_u} \pmod{998244353} $$其中 是在虚树中以 为根的子树中包含的原始 中的节点数。
算法步骤(无代码)
-
预处理 LCA
使用倍增法或树链剖分预处理,支持 查询任意两点的 LCA。 -
构建虚树
- 将 中所有点按 DFS 序排序。
- 将相邻点的 LCA 加入集合 。
- 去重后,用栈算法建立虚树结构。
-
计算贡献
- 在虚树上 DFS,计算每个节点 的子树中包含的原始 中的节点数 。
- 答案 。
复杂度分析
- LCA 预处理:
- 虚树构建:(排序和栈操作)
- 总复杂度:,可处理 的数据规模。
总结
本题的关键在于发现 LCA 矩阵的行列式可以转化为虚树上节点权值的乘积,其中指数由子树中原始查询点的数量决定。利用虚树技术,我们避免了直接计算 规模的矩阵,从而在高效时间内求解。
- 1
信息
- ID
- 3650
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者