2025.05.04 CW 模拟赛 A. 神灵庙
A. 神灵庙
题目描述
Madeline 给你了长度为 \(n\) 的数组 \(\{a_n\}\),要求构造一棵 \(n\) 个叶子的有根二叉树,树上每个节点到左儿子的边长为1,到右儿子的边长为2。你还要将 \(a_i\) 赋值给每个叶子,一个 \(a_i\) 只能赋值给一个叶子。
一个叶子的深度为其到根的简单路径的长度,搭建这棵二叉树所花费的时间为所有叶子的权值与深度之积的和(\(\sum dep \times val\))。
Madeline 希望能尽快地搭建这棵二叉树,所以希望你帮忙求出最少的搭建时间。
思路
如果最终树的形态确定, 那么最优的方案一定是深度大的节点放小的 \(a_i\).
同时最终二叉树的形态取决于每个节点是否作为叶子, 也就是取决于每个点是否下放子节点. 那么对于第 \(i\) 层的节点数量就有
\[\text{第 } i \text{ 层节点数} = \text{第 } i - 1 \text{ 层下放点数} + \text{第 } i - 2 \text{ 层下放点数}
\]
先将 \(a_i\) 降序排序, 然后考虑按照深度进行 \(\rm{DP}\). 具体来说, 我们令 \(f_{d, i, x, y}\) 表示当前深度为 \(d\), 目前总共填了前 \(i\) 个数, 深度为 \(d\) 的可下放点数为 \(x\), 深度为 \(d + 1\) 的可下放点数为 \(y\) 的最小代价. 对于转移, 我们有
\[\begin{cases}
f_{d, i, x, y} \to f_{d + 1, i, y, x + y} \\
f_{d, i, x, y} + a_{i + 1} \times d \to f_{d, i + 1, x - 1, y - 1}
\end{cases}
\]
复杂度 \(\mathcal{O}(n^4)\).
发现事实上我们可以将代价提前计算, 进而把深度一维去掉. 在这道题中, 每层的代价是一段后缀. 于是我们将复杂度优化到了 \(\mathcal{O}(n^3)\), 同时由于约束条件比较多, 常数较小.

浙公网安备 33010602011771号