P11363 [NOIP2024] 树的遍历

· · 题解

好题啊 T3,感觉比 T4 的 CNOI 传统 DS 质量高。

考虑这样连边能得到什么。对于原树上某个点 u,它的所有邻边 (u, v) 之间会两两连边,于是就得到了一个新图中的大小为 deg _ u 的完全子图。原树上每条边 (u, v) 都有两个端点 uv,说明在新图中它只会同时出现在 uv 的完全子图,并且两部分仅能通过 (u, v) 这个点相连。有点仙人掌。

考虑这样遍历能得到什么。是一个 dfs,就是能走多远走多远的那种,如果通过 (u, v)u 的完全子图走到 v 的完全子图,会先把后面 v 子树内所有边都遍历完再回溯回来,再走另一个 (u, w),然后生成树连一条 (u, v) - (u, w) 的边。很难不发现这会在 u 的完全子图中得到一个 长为 deg _ u 的短链。最终的生成树是 n 个这样的短链拼起来的。

再考虑从 (u, v) 开始遍历的话,先进入 v 的完全子图,那很明显 (u, v) 会是短链的一个链头。如果另一个链头是 (v, w) 的话,从 (v, w) 进入到 w 的完全子图,同时 (v, w) 成为了 w 短链的链头……反过来 u 这边也一样。于是注意到有且仅有一条极长的链,由一堆完全子图的短链首尾相接构成,而其他完全子图的短链都通过一个链头直接或者间接地挂在这条极长链上。进一步注意到,一条边能生成一棵树,当且仅当这颗树存在这样的极长链,并且这条边在极长链上。(否则无论如何,生成出来的树的极长链都不是这条)。

挂在这条极长链上计数!回到原树,一条极长链就是原树上一对叶子结点之间的最短路径,显然当路径上存在关键边时才会对答案有贡献。

考虑这个贡献是什么。对于路径上的非叶子结点 u 只会有两条邻边 (u, v)(u, w) 在路径上,并且他们会作为新图中 u 的短链的两个链头,剩下邻边的顺序可以随意钦定,方案数为 (deg _ u - 2)!。对于不在路径上的点 u,设它距离路径最近的一条临边为 (v, u),显然遍历会从 (v, u) 进入到 u 的完全子图,剩下的邻边顺序随意钦定,方案数为 (deg _ u - 1)!。 这道看起来很不可做的题得到了一个 O(n ^ 3) 做法!

很难不发现对于每对叶子 \prod (deg _ u - 1)! 是一样的于是提出来。于是贡献变成了路径上的非叶子节点的 \frac {1} {deg _ u - 1} 之积。随便做有 O(n ^ 2) 或者 O(n ^ 2 \log n)

再看一下这个形式,如果定义一对点的距离是路径上点权之积的话,这题就是对于每对路径上存在关键边的叶子,求出距离和。

点分治秒了!于是我赛时不知道怎么想的直接写了点分治,时间复杂度 O(n \log n),本机大样例最慢点 0.9s,洛谷最慢点 1.2s,CCF 应该能卡过。

实际上赛后发现把贡献挂在 LCA 上 dfs 扫一下统计就行了,就是维护每个点到达子树内经过/不经过关键边的叶子的距离和。时间复杂度 O(n)

赛前一周我试图把 300th 紫留到联赛场切,于是我真的成功了!