#P11828. [TOIP2024] 距離函數
[TOIP2024] 距離函數
Description
小明和小花各有一棵 个节点的有根树,其中小明的树满足节点 的父节点为 、根节点的 为 ;小花的树满足节点 的父节点为 、根节点的 为 。他们想要知道彼此的有根树有多相似,为了明确定义相似程度,他们两人共同设计了一个两棵有根树的「距离函数」,只要距离函数给出的值越大,就表示这两棵树越不相似。
为了同时兼顾树的长相及编号的差异,距离函数大量考虑了「互为祖先关系」的节点对。详细地说,在一棵有根树 上,当两个节点 满足 落在 不断往父节点移动到根节点的路径上时,我们就称 为 在 上的祖先;而当一对节点 满足 为 在 上的祖先、或 为 在 上的祖先时, 在 即互为祖先关系。
小明和小花将以上的距离函数应用在两棵树的情况下,只要一对节点 满足他们在其中一棵树互为祖先关系、另一棵不是的话,他们就认为这两棵有根树的距离增加了。
不过这样的距离函数限制过于死板,为了容许误差的存在,两人又多加入了一个误差参数 来进行函数值的调整,并牵涉到了计算「祖先关系距离」的子函数 ,也就是说,我们可以计算两个节点 在给定的有根树 上距离「成为祖先关系」有多近。很显然的,当 互为祖先关系时,他们的「祖先关系距离」即为 ;而当 互不为祖先关系时,他们的祖先关系距离被定义成「最少的移动步数使得 互为祖先关系」,白话地说,我们可以想象有两颗棋子分别摆在节点 和 上,每一步移动都可以把一颗棋子移动到所在节点的父节点上,而祖先关系距离即是最少的棋子移动次数使得两颗棋子能落在互为祖先关系的节点对上。
要计算 在 上的祖先关系距离 其实很单纯:先找出 在 上的「最近公共祖先」,并取 和 分别往上移动到 的步数中最小的那个即可。
有了祖先关系距离的定义,小明和小花的距离函数终于能够完整地定义清楚:
- 首先决定好一个误差参数 ,以及需要计算距离的两棵有根树 。
- 当一对节点对 满足他们在其中一棵树互为祖先关系、另一棵的祖先关系距离大于 时,该节点对就被视为是有差异的节点对。
- 也就是说,「 且 」或「 且 」。
- 考虑所有 组节点对,有差异的节点对数量即是 的距离函数值。

上图为范例测试数据一和二所给定的两棵有根树,左边的树以节点 为根、右边的树以节点 为根。以节点对 为例,我们可知在左树 ,节点 移动到节点 需要两步,但节点 移动到节点 只需要一步,因此他们在左树的祖先关系距离为 。注意到因为节点对 在右树互为祖先关系,当 时,节点对 会被视为有差异的节点对,同理,节点对 以及 都是有差异的节点对,因此,上图中的两棵树在 时的距离函数值为 ;而当 时,只有 因在左树的祖先关系距离为 会被视为有差异的节点对,距离函数值仅为 。
请你编写一个程序,帮助小明和小花计算给定的两棵有根树在误差参数为 时的距离函数值。
Input Format
- 代表给定的树之大小。
- 代表这次量测两棵树距离时使用的误差参数。
- 在给定的第一棵树中,节点 的父节点为 。特别地,当 时,表示节点 是第一棵树的根节点。
- 在给定的第二棵树中,节点 的父节点为 。特别地,当 时,表示节点 是第二棵树的根节点。
Output Format
- 为一整数,代表给定的两棵树在误差参数 时的距离函数值。
5 0
0 1 1 2 3
5 1 1 1 0
3
5 1
0 1 1 2 3
5 1 1 1 0
1
10 0
6 5 5 5 0 3 4 6 6 6
6 4 5 7 10 7 10 7 3 0
22
10 2
0 1 2 3 4 5 6 7 8 9
8 7 6 5 0 5 4 3 2 1
6
Hint
测试数据限制
- 。
- 。
- 。
- 保证存在唯一一个 满足 ,且序列 形成一个以 为根的有根树。
- 保证存在唯一一个 满足 ,且序列 形成一个以 为根的有根树。
- 输入的数均为整数。
评分说明
本题共有五组子任务,条件限制如下所示。 每一组可有一或多组测试数据,该组所有测试数据皆需答对才会获得该组分数。
| 子任务 | 分数 | 额外输入限制 |
|---|---|---|
| 1 | 。 | |
| 2 | 。 | |
| 3 | 。 | |
| 4 | 。 | |
| 5 | 无额外限制。 |
京公网安备 11011102002149号