P15584 [KTSC 2026] 网格树 / Grid Tree

题目描述

给定一棵 $N$ 个点的有根树,其节点编号 $0\sim N-1$。点 $0$ 是根,每个点有 $0$ 或 $2$ 个儿子。对恰有两儿子的节点,区分左儿子和右儿子。每条树边 $e$ 有正整数长度 $c_e$。 将树画在二维笛卡尔坐标系中。每个节点 $v$ 被画在不同的格点 $m_v=(x_v,y_v)$ 处。这里,根必须画在 $m_0=(0,0)$ 处。格点即 $x,y$ 坐标均为整数的点。 一条连接 $v$ 和其父亲 $p$ 的树边 $e=(p,v)$ 在坐标系中被画成一条连接 $m_p$ 和 $m_v$ 的路径。路径必须满足以下所有条件: - 沿着从 $m_p$ 到 $m_v$ 的路径移动时,运动方向必须始终为 $x$ 轴正方向或 $y$ 轴正方向。这意味着,沿 $x$ 坐标和 $y$ 坐标均递增的方向的路径不合法。此外,方向只能在格点处改变。这意味着,若一条路径长度为 $k$,方向只可能在 $(k-1)$ 个格点处改变。 - 若 $v$ 是 $p$ 的左儿子,路径从 $m_p$ 的起始方向必须沿 $x$ 轴正方向。 - 若 $v$ 是 $p$ 的右儿子,路径从 $m_p$ 的起始方向必须沿 $y$ 轴正方向。 - 路径长度至少为对应边的边长 $c_e$。 - 路径**不能相交**。换言之,一条路径的内点(即除去起终点后的所有点)不能在另一条路径上。 定义节点 $v$ 的**坐标系深度**为 $L(v)=x_v+y_v$。在画出来的树中,所有叶子(无儿子的节点)的坐标系深度必须相同。定义叶子的深度为**网格深度**。 在所有合法的画图方式中,求出**网格深度**的最小值。 ### 实现细节 **这是一道函数式交互题**。你不必,也不应实现 `main` 函数。 你应当实现以下的函数: ```cpp long long compute_min_depth(int N, vector P, vector C, vector D) ``` - $N$:节点数。 - $P,C,D$:大小为 $N-1$ 的整数数组。对于任意 $1\le i\le N-1$,点 $i$ 的父亲为 $P[i-1]$。令 $e$ 为 $i$ 与它父亲的连边,则 $c_e=C[i-1]$。若 $D[i-1]=0$,点 $i$ 为左儿子;否则 $D[i-1]=1$,点 $i$ 为右儿子。 - 可以证明,存在一种合法的画图方式。该函数应当返回合法的画图方式中,网格深度的最小值。 - 该函数被调用恰好一次。 你的源代码中不应调用任何输入/输出函数。

输入格式

示例评测程序的输入格式如下: - 第 $1$ 行:$N$ - 对于所有 $0 \leq i < N - 1$: - 第 $2 + i$ 行:$P[i]$ $C[i]$ $D[i]$

输出格式

示例评测程序按以下格式打印答案: - 第 $1$ 行:`compute_min_depth` 的返回值

说明/提示

### 数据范围 - 给定的是以点 $0$ 为根的有根树; - 每个节点的儿子数为 $0$ 或 $2$; - $3\le N\le 200\, 000$; - 对于任意 $0\le i\le N-2$,$0\le P[i]\le N-1$; - 对于任意 $0\le i\le N-2$,$1\le C[i]\le 10^9$; - 对于任意 $0\le i\le N-2$,$0\le D[i]\le 1$。 ### 子任务 定义两个节点的距离为连接这两个节点的唯一简单路的边权之和。 定义叶子为有 $0$ 个儿子的点。 | 编号 | 得分 | 限制 | | :-: | :-: | :- | | $1$ | $10$ | $N\le 7$ | | $2$ | $ 8$ | 对于任意有两个儿子的点 $v$,$v$ 的其中一个儿子是叶子 | | $3$ | $21$ | $N\le 5\,000$,所有叶子到点 $0$ 距离均为 $K$($\le 2500$) | | $4$ | $29$ | $N\le 5\, 000$,所有节点到点 $0$ 的距离至多为 $2500$ | | $5$ | $32$ | 无额外限制 | ### 计分方式 对于子任务 $3$,若网格深度恰为 $K$ 的画图方式不存在,且 `compute_min_depth` 返回 $-1$,该测试点将被判为正确。更为精确地说: - 对于存在网格深度恰为 $K$ 的画图方式的测试点: - 若返回 $K$,得满分; - 否则,得 $0$ 分。 - 对于不存在网格深度恰为 $K$ 的画图方式的测试点: - 若返回最小网格深度,得满分; - 若返回 $-1$,得满分; - 否则,得 $0$ 分。 注意:子任务 $3$ 中,所有叶子到点 $0$ 的距离均相等,为 $K$。 ### 样例 #### 样例 $1$ 考虑以下调用: `compute_min_depth(5, [4, 0, 4, 0], [1, 2, 1, 1], [0, 1, 1, 0])` - 我们可以画出一棵网格深度为 $2$ 的树,如下图所示。 ::::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/5mct39vj.png) :::: 可以证明,不存在网格深度小于 $2$ 的绘图。 因此,该函数应返回 $2$。 #### 样例 $2$ 考虑以下调用: `compute_min_depth(9, [0, 0, 1, 1, 2, 2, 5, 5], [2, 1, 1, 1, 1, 1, 1, 1], [0, 1, 0, 1, 0, 1, 0, 1])` - 我们可以画出一棵网格深度为 $4$ 的树,如下图所示。 ::::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/9993e6v2.png) :::: 因此,该函数应返回 $4$。