P11363 [NOIP2024] 树的遍历

· · 个人记录

赛时做法

感性读题

首先如果把边全建出来,就变成了每个原图的点周围都包着一个完全图一样的东西

而我们大概要对于每一个完全图内部确定一个链,或者说确定一个遍历顺序,称为一个方案。我们要计数所有能从某个关键边开始遍历全图的方案

k=1

一些必要的观察

当 k\neq 1 的时候,我们尝试观察:对于每一种给完全图确定链的方式,它能被哪些关键边统计

结合 k=1,可以发现,一个链的确定方案能被关键边 E 统计到,当且仅当:

分别以 E 的两个端点为根,设当前所在的点是 x,那么对于它的所有孩子 y,x 必须是 y 所在完全图的链的链首

因为链代表着遍历顺序,所以第一次被遍历到的一定是父亲,和 k=1 的情况很相似

平方 log

到现在还是有点抽象,但如果我们对于每个完全图,把它链的两个端点连接到完全图中心的原图点上,就会有些不一样

这是某个方案的连接:

可以看到存在一条从叶子到叶子的主路径。通过观察可以得知,这个链的确定方案只会被主路径上的关键边统计。换言之,如果一个方案的主路径上存在关键边,这个方案就会被计入答案。

所以我们可以枚举主路径,即枚举所有叶子对,把他们之间的简单路径当做主路径。

考虑对于一对确定的叶子,满足主路径是这个路径的方案有多少:

因此我们有了一个 n^2\log 的做法:

单 log

这个做法很明显可以优化,这一步就很简单了,考虑 DP,或者说再简单预处理一下。

转移是非常容易的 差分数组之和就是刚才 $n^2\log$ 的做法内差分要用的东西 因此只需要枚举 LCA,前缀和优化一下,就能求出来这个 LCA 对答案的贡献了 最后这一部分应该很简单,写着代码很容易找到 复杂度 $O(n\log n)$,$\log$ 是求逆元用的快速幂,常数还好 ## 趣逝 写到 11 点半一直过不去大样例,最后发现是 DP 数组少了取模爆 LL 了 /kk