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)\), 同时由于约束条件比较多, 常数较小.

posted @ 2025-05-05 16:38  Steven1013  阅读(11)  评论(0)    收藏  举报