专栏文章

题解:P14509 树上求值 tree

P14509题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@min79s1z
此快照首次捕获于
2025/12/01 21:43
3 个月前
此快照最后确认于
2025/12/01 21:43
3 个月前
查看原文
这题感觉比较套路,但场上想了 3030 min 开始写然后因为代码能力太差又花了一个半小时还是太菜了。
下文中定义 SiS_{i}ii 及其子树中点构成的集合。
注意到 f(i)\sum f(i) 容易用 0101 Trie 树整体计算,并且f(i+dLCA*(i,x))f(i+d_{\operatorname{LCA*}(i,x)}) 这样的式子里的 dd(节点深度)在 dfs 过程中每步只会加减一,容易联想到 Trie 树全局加减,因此尝试往 0101 Trie 这个方向想。
我们发现,一个节点的 ss 值可以按如下方式划分(黄点为根,红点为当前点):
红点(编号为 33)的 ss 值即可表示为 iS1S2f(i+1)+iS2S3f(i+2)+iS3f(i+3)=iS1f(i+1)iS2f(i+1)+iS2f(i+2)iS3f(i+2)+iS3f(i+3)\sum\limits_{i \in \complement_{S_{1}} S_{2}} f(i+1) + \sum\limits_{i \in \complement_{S_{2}} S_{3}} f(i+2) + \sum\limits_{i \in S_{3}} f(i+3) = \sum\limits_{i \in S_{1}} f(i+1) - \sum\limits_{i \in S_{2}} f(i+1) + \sum\limits_{i \in S_{2}} f(i+2) - \sum\limits_{i \in S_{3}} f(i+2) + \sum\limits_{i \in S_{3}} f(i+3)
这个过程类似于换根,因此,我们考虑在遍历原树的时候维护每棵子树中每个点(称这个点为 xx)的 i+dxi+d_{x} 的值构成的 0101 Trie(每个点对应的 Trie 树由孩子节点的 Trie 树全局减一然后合并,再插入自己得来),然后记录每个点的 iSxf(i+dx)\sum\limits_{i \in S_{x}} f(i+d_{x}) 以及 iSxf(i+dx1)\sum\limits_{i \in S_{x}} f(i+d_{x}-1) 的结果,最后我们就可以再跑一次 dfs 记录从根出发路径上的信息和得到每个点的 ss 值。
考虑到 0101 Trie 树的插入、合并和全局减操作,每组数据时间复杂度均为 O(nlogn)O(n \log n)。由于我赛时脑子坏了 0101 Trie 树写启发式合并导致代码略为繁琐且时间复杂度较高(多带了一个 log\log 但是卡常卡过去了),因此不再展示。

评论

1 条评论,欢迎与作者交流。

正在加载评论...