称点 i 子树中所有点点权的 \operatorname{mex} 为 d_i。称 u 的儿子构成集合 son_u,u 的祖先构成集合 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} 表示目前儿子中最大的 d 为 i,以及有 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 方向一致,于是可以放宽到任意钦定一个 v 为 u 的重儿子,并继承它的 d_v。这样会形成一个剖分的结构。而对于每个白点,找到它的祖先中的某个黑点 u,那么它的存在会让 u 到它所在链顶的路径上的点的 d 都加一,即它的贡献是 u 所在重链的深度。称 c_u 为 u 所在重链的深度,即深度比它小的、和它在同一重链上的点的数量加一。于是一个白点 i 的贡献是 \max_{u \in anc_i} c_u。