logo AlgoBeat OnlineJudge
登录 注册

#215487. [KTSC 2026] 网格树 / Grid Tree

内存限制:1024 MiB 时间限制:3000 ms 标准输入输出
题目类型:VJudge(洛谷) 评测方式:VJudge
上传者: 匿名

题目描述

给定一棵 个点的有根树,其节点编号 。点 是根,每个点有 个儿子。对恰有两儿子的节点,区分左儿子和右儿子。每条树边 有正整数长度

将树画在二维笛卡尔坐标系中。每个节点 被画在不同的格点 处。这里,根必须画在 处。格点即 坐标均为整数的点。

一条连接 和其父亲 的树边 在坐标系中被画成一条连接 的路径。路径必须满足以下所有条件:

  • 沿着从 的路径移动时,运动方向必须始终为 轴正方向或 轴正方向。这意味着,沿 坐标和 坐标均递增的方向的路径不合法。此外,方向只能在格点处改变。这意味着,若一条路径长度为 ,方向只可能在 个格点处改变。
  • 的左儿子,路径从 的起始方向必须沿 轴正方向。
  • 的右儿子,路径从 的起始方向必须沿 轴正方向。
  • 路径长度至少为对应边的边长
  • 路径不能相交。换言之,一条路径的内点(即除去起终点后的所有点)不能在另一条路径上。

定义节点 坐标系深度。在画出来的树中,所有叶子(无儿子的节点)的坐标系深度必须相同。定义叶子的深度为网格深度

在所有合法的画图方式中,求出网格深度的最小值。

实现细节

这是一道函数式交互题。你不必,也不应实现 main 函数。

你应当实现以下的函数:

long long compute_min_depth(int N, vector<int> P, vector <int> C, vector<int> D)
  • :节点数。
  • :大小为 的整数数组。对于任意 ,点 的父亲为 。令 与它父亲的连边,则 。若 ,点 为左儿子;否则 ,点 为右儿子。
  • 可以证明,存在一种合法的画图方式。该函数应当返回合法的画图方式中,网格深度的最小值。
  • 该函数被调用恰好一次。

你的源代码中不应调用任何输入/输出函数。

输入格式

示例评测程序的输入格式如下:

  • 行:
  • 对于所有
    • 行:

输出格式

示例评测程序按以下格式打印答案:

  • 行:compute_min_depth 的返回值

样例

样例输入 1

5
4 1 0
0 2 1
4 1 1
0 1 0

样例输出 1

2

样例输入 2

9
0 2 0
0 1 1
1 1 0
1 1 1
2 1 0
2 1 1
5 1 0
5 1 1

样例输出 2

4

数据范围与提示

数据范围

  • 给定的是以点 为根的有根树;
  • 每个节点的儿子数为
  • 对于任意
  • 对于任意
  • 对于任意

子任务

定义两个节点的距离为连接这两个节点的唯一简单路的边权之和。

定义叶子为有 个儿子的点。

编号 得分 限制
对于任意有两个儿子的点 的其中一个儿子是叶子
,所有叶子到点 距离均为
,所有节点到点 的距离至多为
无额外限制

计分方式

对于子任务 ,若网格深度恰为 的画图方式不存在,且 compute_min_depth 返回 ,该测试点将被判为正确。更为精确地说:

  • 对于存在网格深度恰为 的画图方式的测试点:
    • 若返回 ,得满分;
    • 否则,得 分。
  • 对于不存在网格深度恰为 的画图方式的测试点:
    • 若返回最小网格深度,得满分;
    • 若返回 ,得满分;
    • 否则,得 分。

注意:子任务 中,所有叶子到点 的距离均相等,为

样例

样例

考虑以下调用:

compute_min_depth(5, [4, 0, 4, 0], [1, 2, 1, 1], [0, 1, 1, 0])

  • 我们可以画出一棵网格深度为 的树,如下图所示。

::::align{center} ::::

可以证明,不存在网格深度小于 的绘图。

因此,该函数应返回

样例

考虑以下调用:

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])

  • 我们可以画出一棵网格深度为 的树,如下图所示。 ::::align{center} ::::

因此,该函数应返回