P14637

· · 题解

Tree

u 点权 a_u,价值 b_u,你要最大化的即 \sum_u b_u

考虑 a_u 的分配,设 x=\text{mex}_{v\in \text{sub}_u-\{u\}}a_v,按 a_u 分为取 x>x 两种情况。两类点 b_u 都已经确定,而后者的存在是为了增加 u 某个祖先的 b_v,不妨放到对应祖先处确定具体值。

f_{u,i,j} 为子树 u 内已确定的 a_v\text{mex}ij 个点未确定,此时最大价值,转移即枚举 b_u-\max_{v\in \text{son}_u}b_v

不妨钦定某个 v 处取到 \max,这形成一个链剖,在这个结构上考虑 b_u\max_vb_v 基础上每次 +1 的贡献,即对 u\text{tp}_u 这条链上所有点 b+1,其对总答案的贡献即链内深度(1-index),设之 d_u

换言,初始 d_1=1,每个 u 恰选择一个重儿子 v 使 d_v=d_u+1,其余 d_v=1,最大化 \sum_u(\max_{v\in \text{anc}_u}d_v)

f_{u,i} 表示: 钦定 u 为其所在重链的 tpu 祖先链上的 d_{\max}i,此时 u 子树的最大价值和。

为了处理更新 d_{\max} 的情况,再令 g_{u,i} 表示 u 为其所在重链中间一个点,祖先链 d_{\max}u 处取到 i,子树价值。

每个深度开线段树做到 $O(nm\log n)$,长剖技巧做到 $O(nm)$,此处不再赘述。 另一个视角是想要更直观地刻画贡献给祖先的点的贡献,下将 $a_u=x$ 的点称作黑点,$a_u>x$ 称为白点。 发现黑点 $u$ 一定可以有黑点儿子,否则取子树黑点 $\text{mex}$ 最大的儿子 $v$,交换 $a_u,a_v$ 不劣,这样 $v$ 成为黑点。 将这个 $v$ 看作 $u$ 的重儿子,黑点内部形成链剖,此时白点 $u$ 所贡献即是其祖先中深度最小的黑点 $v$,否则将 $v$ 改成白点和 $u$ 贡献给同一个点不劣。 设 $f_{u,i}$ 为 $u$ 最深祖先黑点链内深度为 $i$ 时的子树 $u$ 的最大价值,这是为了处理首个黑点祖先在子树外的那些点,转移同样可以优化。 参考了 CommonAnts 的题解,感谢他耐心给我讲。