#2033. 「IOI 2023」山毛榉树

内存限制:2048 MiB 时间限制:1500 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: HHOJ

题目描述

Vétyem Woods 是一片著名的缤纷多彩的森林。其中最老最高的一棵山毛榉树叫 Ős Vezér。

树 Ős Vezér 可以被建模成 结点的集合。结点的编号为从 ,边的编号为从 。每条边均连接树上两个不同的结点。具体地说,边 )从结点 连接到结点 ,这里 。结点 被称为是结点 父结点,而结点 被称为是结点 的一个子结点

每条边都有某种颜色。一共有 种可能的颜色,编号为从 。边 的颜色为 。不同的边可能有相同的颜色。

注意,在上面的定义中, 的情形并不对应树上的边。方便起见,我们令

例如,假定 Ős Vezér 有 个结点和 种可能的颜色,以及 条边。边的描述为 ,边的颜色为 。这棵树如下图所示:

beechtree-tree.png

Árpád 是一位才华横溢的护林人,他喜欢研究树上被称为子树的部分。 对所有满足 ,结点 的子树是一个满足以下性质的结点集合

  • 结点 属于
  • 如果某个结点 属于 ,则 的所有子结点都属于
  • 除了上述情况以外,其他结点都不属于

集合 的大小记作

Árpád 最近发现了一个复杂但有趣的子树性质。Árpád 的发现需要用到大量的纸和笔做演算,他认为你需要做同样的事情才能完成理解。他还会给你几个例子,让你能够对它们做详细的分析。

假设我们有某个给定的 ,以及子树 中结点的某个置换

对于所有满足 ,令 为颜色 在长为 的颜色序列 中的出现次数。

(注意, 必定为 ,原因是其定义中要考察的颜色序列是空的。)

置换 被称为是一个绝妙置换,当且仅当以下性质成立:

  • 对于所有满足 ,结点 的父结点是

对于所有满足 ,子树 是一棵绝妙子树,当且仅当 中结点存在某个绝妙置换。注意,根据定义,仅包含单独一个结点的子树都是绝妙的。

考虑上面给出的树的例子。可以看到,子树 不是绝妙的。子树 是绝妙的,因为它仅包含一个结点。接下来,我们将要说明子树 也是绝妙的。

考虑一个由不同整数构成的序列 。这个序列是 中结点的一个置换。下图给出了这个置换。序列中每个结点旁边的数字,是该结点在置换中的索引。

beechtree-label1.png

我们将要验证,这是一个绝妙置换

  • ,原因是 在序列 中出现了 次。
  • 相应地, 的父结点是 。也就是说, 的父结点是 。(形式化地,。)
  • ,原因是 在序列 中出现了 次。
  • 相应地, 的父结点是 。也就是说, 的父结点是
  • ,原因是 在序列 中出现了 次。
  • 相应地, 的父结点是 。也就是说, 的父结点是
  • ,原因是 在序列 中出现了 次。
  • 相应地, 的父结点是 。也就是说, 的父结点是 4。
  • ,原因是 在序列 中出现了 次。
  • 相应地, 的父结点是 。也就是说, 的父结点是
  • ,原因是 在序列 中出现了 次。
  • 相应地, 的父结点是 。也就是说, 的父结点是

由于我们能为 中的结点找到一个绝妙置换,子树 因此是一棵绝妙子树

你的任务是,帮助 Árpád 确定 Ős Vezér 的每棵子树是否是绝妙的。

实现细节

你需要在程序开始引入库 beechtree.h

你需要实现以下函数。

int[] beechtree(int N, int M, int[] P, int[] C)
  • :树中的结点数量。
  • :树中边的可能颜色的数量。
  • :长度为 的两个数组,以描述树中的边。
  • 该函数应当返回长度为 的某个数组 。 对所有满足 ,如果 是绝妙的,则 应为 ,否则应为
  • 该函数在每个测试用例上恰好被调用一次。

例子

例 1

beechtree(4, 2, [-1, 0, 0, 0], [0, 1, 1, 2])

这棵树如下图所示:

beechtree-ex1.png

均各自包含单独一个结点,因此都是绝妙的。 不是绝妙的。 因此,函数应当返回

例 2

考虑如下调用:

beechtree(18, 3, 
          [-1, 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 10, 11, 11],
          [0, 1, 2, 3, 1, 2, 3, 1, 3, 3, 2, 1, 1, 2, 2, 1, 2, 3])

这个例子在题面中已经给出。

函数应当返回

例 3

考虑如下调用:

beechtree(7, 2, [-1, 0, 1, 1, 0, 4, 5], [0, 1, 1, 2, 2, 1, 1])

该例子如下图所示。

beechtree-ex3.png

是唯一不是绝妙的子树。函数应当返回

约束条件

  • (对于所有满足
  • (对于所有满足

子任务

  1. (9 分)
  2. (5 分)边 从结点 连接到结点 。也就是说,对所有满足 ,都有
  3. (9 分)除了结点 以外,其他结点要么连接到结点 ,要么连接到某个连接到结点 的结点。 也就是说,对于所有满足 ,要么有 ,要么有
  4. (8 分)对于所有满足 ,至多有两条边的颜色为
  5. (14 分)
  6. (14 分)
  7. (12 分)
  8. (17 分)
  9. (12 分) 没有额外的约束条件。

评测程序示例

评测程序示例按以下格式读取输入:

  • 行:
  • 行:
  • 行:

表示 beechtree 所返回的数组中的元素。评测程序示例以如下格式,在单行中输出你的答案:

  • 行: