P15114 题解

· · 题解

算法一

首先可以发现:

dp_{i,t,j} 表示以 i 为根的子树中,当点 i 是否与其父节点匹配的状态为 t\in\{0,1\},且子树内 \sum h = j 时的最小总代价。朴素实现的时间复杂度为 \mathcal O(nk^2),空间复杂度为 \mathcal O(nk)

可以通过子任务 1\sim 2,期望得分 10 分。

算法二

下面通过费用流模型证明 dp_{i,0} 在偶数位置上的凸性。

构造一个包含 n(k+2)+2 个点的最小费用流网络,其中点包括源点 S、汇点 T,点 P_{i,j}(1\le i\le n,1\le j\le k),以及点 A_i,B_i(1\le i\le n)。 定义 dep_i 为节点 i 至根节点路径上的节点数量,按如下方式连边:

  1. 对任意树边 (x,y),若 dep_x 为奇数,则从 B_xA_y 连一条容量为 1,费用为 0 的边,否则从 B_yA_x 连一条容量为 1,费用为 0 的边。

1 类边的含义是,若从 S 连向 P_{i,j} 的边被流经,或从 P_{i,j} 连向 T 的边被流经,则 h_i\ge j

2\sim 5 类边的含义是限制了若 h_i 为偶数,则必定是 P_{i,2j-1},P_{2j} 之间相互匹配;若 h_i 为奇数,则最后多出来的 P_{i,h_i} 会和某个 P_{j,h_j} 匹配。

我们还需证明,对任意固定的 i,被匹配的点 P_{i,j} 构成一个前缀。考虑反证,由 f 的凸性可知 f(a_i,b_i,c_i,j)-f(a_i,b_i,c_i,j-1) 是关于 j 递增的,故若匹配的不是一个前缀,则必定可以通过交换匹配关系将其调整为前缀形式,且不增加总费用,与最优性矛盾。

因此,流量为 F 的最小费用流的费用,加上 \sum_{i=1}^nf(a_i,b_i,c_i,0),恰好等于 dp_{1,0,2F}。由费用流的凸性可得 dp_{i,0} 在偶数位置上的凸性。同理可证 dp_{i,1} 在奇数位置上的凸性。

利用 dp 数组的凸性,在转移过程中可以通过闵可夫斯基和进行优化,在 \mathcal O(k) 时间内完成一次合并,从而将时间复杂度降至 \mathcal O(nk)

朴素时间的空间复杂度为 \mathcal O(nk),可以通过子任务 1\sim 4,期望得分 35 分。

算法三(树的形态随机生成)

此时树的深度只有 \mathcal O(\log n),而 DP 时只需保留根到当前结点的 DP 数组,故空间复杂度是 \mathcal O(n+k\log n) 的。

输出方案可以先 DP 一次然后求出每个儿子子树内的 \sum h,然后再递归做下去,可以分析出 \mathcal O(nk) 的时间复杂度。

结合算法二,可以通过子任务 1\sim 6,期望得分 45 分。

算法四(树的形态是一条链)

时间复杂度 $T(n,k)=\mathcal O(nk)+\max_{i=1}^k\{T(n/2,i)+T(n/2,k-i)\}=\mathcal O(nk)$,空间复杂度 $\mathcal O(n+k)$。 结合算法二、三,可以通过子任务 $1\sim 7$,期望得分 $60$ 分。 ### 算法五($op=0$) 考虑优化算法二的空间复杂度。 观察可知在 DFS 的过程中,我们只需记录当前结点到根的所有点中,已经处理完了至少一个儿子的点的 DP 数组。 我们对树进行重链剖分,然后在 DFS 的过程中,我们先 DFS 重儿子再 DFS 轻儿子。 那么可以发现,每记录一个点的 DP 值,子树大小就会减半,因此我们最多记录 $\mathcal O(\log n)$ 个点的 DP 值。 时间复杂度 $\mathcal O(nk)$,空间复杂度 $\mathcal O(n+k\log n)$,结合算法二、三,可以通过子任务 $1\sim 6,8,10$,期望得分 $65$ 分。 ### 算法六($op=1$) 考虑如何构造方案。 考虑点分治,找到分治重心后,我们将其所有子树分为两个集合 $A,B$。 若存在一个子树的大小 $\ge\dfrac 13n$,则我们将其划分到 $A$ 中,将其它子树划分到 $B$ 中。 否则所有子树的大小都 $<\dfrac 13n$,我们按任意顺序将子树加入 $A$,当 $A$ 中的子树大小之和 $\ge\dfrac 13$ 时就停下,将剩下的子树划分到 $B$ 中。 不难发现此时这两个集合的子树大小之和都在 $\left[\dfrac 13n,\dfrac 23n\right]$ 之间,我们利用算法五求出分治重心的 $h$ 以及 $A,B$ 的 $\sum h$。 然后递归处理即可,时间复杂度 $T(n,k)=\mathcal O(nk)+\max_{i=1}^k\{T(n/2,i)+T(n/2,k-i)\}=\mathcal O(nk)$,空间复杂度仍是 $\mathcal O(n+k\log n)$。 可以通过子任务 $1\sim 11$,期望得分 $100$ 分。 --- 更多内容可以阅读笔者的集训队论文《再谈信息学竞赛中的空间优化问题》。