From: TrisolarisHD Date: Wed, 27 Mar 2019 15:03:05 +0000 (+0800) Subject: 挪动了一些原本在杂项中的内容. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=48b09fdd0e06567d2c8e6cb06dbee64a730969a3;p=oi-wiki%2Fmain.git 挪动了一些原本在杂项中的内容. --- diff --git a/docs/graph/dsu-on-tree.md b/docs/graph/dsu-on-tree.md index 37cdb84d..b3a9fc67 100644 --- a/docs/graph/dsu-on-tree.md +++ b/docs/graph/dsu-on-tree.md @@ -17,7 +17,7 @@ void merge(int x, int y) { } ``` -在这里,对于两个大小不一样的集合,我们将大小小的并到大的,而不是大的连接小的。 +在这里,对于两个大小不一样的集合,我们将小的集合合并到大的集合中,而不是将大的集合合并到小的集合中。 为什么呢?这个集合的大小可以认为是集合的高度(在正常情况下),而我们将集合高度小的并到高度大的显然有助于我们找到父亲 @@ -43,7 +43,7 @@ void merge(int x, int y) { 直接暴力预处理的时间复杂度为 $O(n^2)$ ,即对每一个子节点进行一次遍历,每次遍历的复杂度显然与 $n$ 同阶,有 $n$ 个节点,故复杂度为 $O(n^2)$ 。 -可以发现,每个节点的答案是其子树的叠加,考虑利用这个性质处理问题。 +可以发现,每个节点的答案由其子树何其本身得到,考虑利用这个性质处理问题。 我们可以先预处理出每个节点子树的 $size$ 和它的重儿子,重儿子同树链剖分一样,是拥有节点最多子树的儿子,这个过程显然可以 $O(n)$ 完成 @@ -59,11 +59,11 @@ void merge(int x, int y) { ![dsu-on-tree-2.png](./images/dsu-on-tree-2.png) -_上图是一个例子_ +上图是一个例子。 这样,对于一个节点,我们遍历了一次重子树,两次非重子树,显然是最划算的。 -经过这个过程,我们获得了这个节点的子树的所有 ans +通过执行这个过程,我们获得了这个节点所有子树的 ans 为什么不合并第一步和第三步呢?因为 check 数组不能重复使用,否则空间会太大,需要在 $O(n)$ 的空间内完成。 diff --git a/docs/graph/matrix-tree.md b/docs/graph/matrix-tree.md index 68637388..588e7f1c 100644 --- a/docs/graph/matrix-tree.md +++ b/docs/graph/matrix-tree.md @@ -103,12 +103,12 @@ $$ ## 例题 ???+ note "例题 1" - 「HEOI2015」小 Z 的房间,可参考 + 「HEOI2015」小 Z 的房间,可参考。 **解** 矩阵树定理的裸题。将每个空房间看作一个结点,根据输入的信息建图,得到 Laplace 矩阵后,任意删掉 L 的第 $i$ 行第 $i$ 列,求这个子式的行列式即可。求行列式的方法就是高斯消元成上三角阵然后算对角线积。另外本题需要在模 $k$ 的整数子环 $\mathbb{Z}_k$ 上进行高斯消元,采用辗转相除法即可。 ???+ note "例题 2" - 「FJOI2007」轮状病毒。可参考 + 「FJOI2007」轮状病毒,可参考。 **解** 本题的解法很多,这里用矩阵树定理是最直接的解法。当输入为 $n$ 时,容易写出其 $n+1$ 阶的 Laplace 矩阵为: