专栏文章

题解:P14637 [NOIP2025] 树的价值 / tree(民间数据)

P14637题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mimx7yfw
此快照首次捕获于
2025/12/01 17:02
3 个月前
此快照最后确认于
2025/12/01 17:02
3 个月前
查看原文
称点 ii 子树中所有点点权的 mex\operatorname{mex}did_i。称 uu 的儿子构成集合 sonuson_uuu 的祖先构成集合 ancuanc_u。不失一般性的称其中某个儿子 vsonuv \in son_u
首先有一些基础的结论 dudv,au>avd_u \ge d_v,a_u > a_v
思考可以发现,我们可以将所有点 uu 分为两类:一类 du=maxdvd_u=\max d_v,另一类 du>maxdvd_u > \max d_v。对于第一类我们会把 aua_u 变的很大,用于提高 uu 的祖先的 dd即孝敬父亲。称第一类为白点,第二类为黑点。
最终形式会是:所有点 du=maxdvd_u = \max d_v(可以发现取到最大的 vv 一定是黑点)。然后对于每个白点,找到它祖先中第一个黑点的位置,并将它的 dd 增加一。
于是得到暴力 DP:fu,i,jf_{u, i, j} 考虑 uu 的子树且 du=id_u=i 且总共有 jj 个白点还没贡献的答案。j=0j=0 表示 uu 是黑点否则是白点。转移的话再开一个数组 gi,jg_{i,j} 表示目前儿子中最大的 ddii,以及有 jj 个白点。
gi,j+fv,i,jgmax(i,i),j+jg_{i,j} + f_{v,i',j'} \to g_{\max(i,i'), j + j'}
最后:
gi,j+i+j+1fu,i+j+1,0gi,j+ifu,i,j+1g_{i,j} +i+j+1 \to f_{u, i+j+1,0}\\ g_{i,j} +i\to f_{u,i,j+1}
考虑复杂度。(u,j,j)(u,j,j') 的总枚举量是树上背包,即 O(n2)\mathcal O(n^2)(i,i)(i,i') 还会有 O(n2)\mathcal O(n^2),可以前缀和优化到 O(n)\mathcal O(n)。总复杂度 O(n3)\mathcal O(n^3)。不知道为啥没写前缀和就过了 48 分。
继续刻画。初始 du=maxdvd_u = \max d_v,这与最外层的 max\max 方向一致,于是可以放宽到任意钦定一个黑点 vvuu 的重儿子,并继承它的 dvd_v。可以证明一个点一定存在至少一个黑儿子。这样会形成一个剖分的结构。而对于每个白点,找到它祖先中第一个黑点 uu,那么它的贡献会让 uu 到它所在链顶的 dd 都加一,即它的贡献是 uu 所在重链的深度。称 cuc_uuu 所在重链的深度,即深度比它小的、和它在同一重链上的点的数量加一。这样我们就将贡献计算全放在了白点上。暴力做法可以 O(2n)\mathcal O(2^n) 枚举黑白点的掩码。
为什么一定存在黑儿子?
如果 uu 的儿子都是白点,则找到它所在子树中最浅的黑点,把它到 uu 的路径都改成黑点,则所有点的 dd 都不变。前提是我们强制称所有叶子节点都是黑点。
这样一条重链上只有链顶可能是白点,其余都是黑点。
换一种 DP。fu,if_{u,i} 表示考虑 uu 的子树的白点的贡献且 cu=ic_u=i 的答案。转移枚举它的重儿子 vv,则:
fv,i+1f_{v,i+1}

评论

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

正在加载评论...