题解:P14637 [NOIP2025] 树的价值 / tree

· · 题解

称点 i 子树中所有点点权的 \operatorname{mex}d_i。称 u 的儿子构成集合 son_uu 的祖先构成集合 anc_u。不失一般性的称其中某个儿子 v \in son_u

首先有一些基础的结论 d_u \ge d_v,a_u > a_v

思考可以发现,我们可以将所有点 u 分为两类:一类 d_u=\max d_v,另一类 d_u > \max d_v。对于第一类我们会把 a_u 变的很大,用于提高 u 的祖先的 d即牺牲自己孝敬父亲。称第一类为白点,第二类为黑点。

如果确定了每个点的黑白颜色,最终答案可以这样刻画:对于每个白点,找到一个它的黑点祖先,将自己贡献给它。最后 d_u 就是 \max d_v 加上贡献给它的白点数量(如果 u 是黑点)。

于是得到暴力 DP:f_{u, i, j} 考虑 u 的子树且 d_u=i 且总共有 j 个白点还没贡献的答案。j=0 表示 u 是黑点否则是白点。转移的话再开一个数组 g_{i,j} 表示目前儿子中最大的 di,以及有 j 个白点。

g_{i,j} + f_{v,i',j'} \to g_{\max(i,i'), j + j'}

最后,如果 u 是白点:

g_{i,j} +i\to f_{u,i,j+1}

否则 u 是黑点,枚举有几个白点分配给它,剩下的暂时留着用来分给祖先:

g_{i,j} +i+k+1 \to f_{u, i+k+1,j-k}\\

直接做复杂度 \mathcal O(n^4),容易前缀和优化做到 \mathcal O(n^3)

:::warning[其实] 其实最后 g \to f 时,如果 u 是黑点,我们不需要枚举 k,因为可以证明所有白点贡献给它最近的黑点祖先是最优的,即 k = j 就能取到所有最优情况。 :::

继续刻画。注意到 d_u = \max d_v 的操作与最外层的 \max 方向一致,于是可以放宽到任意钦定一个 vu重儿子,并继承它的 d_v。这样会形成一个剖分的结构。而对于每个白点,找到它的祖先中的某个黑点 u,那么它的存在会让 u 到它所在链顶的路径上的点的 d 都加一,即它的贡献是 u 所在重链的深度。称 c_uu 所在重链的深度,即深度比它小的、和它在同一重链上的点的数量加一。于是一个白点 i 的贡献是 \max_{u \in anc_i} c_u

同时发现黑点的贡献就是 c_u