#L3991. 「IOI2023」山毛榉树

「IOI2023」山毛榉树

题目描述

Vétyem Woods 中的山毛榉树 Ős Vezér 可建模为一棵包含 NN 个结点和 N1N-1 条边的树。结点编号为 00N1N-1,边编号为 11N1N-1。边 ii1i<N1 \le i < N)连接结点 ii 和其父结点 P[i]P[i]0P[i]<i0 \le P[i] < i),且每条边有颜色 C[i]C[i](颜色编号为 11MM)。为方便,定义 P[0]=1P[0] = -1C[0]=0C[0] = 0(结点 00 无父结点)。

子树定义

对结点 rr0r<N0 \le r < N),其子树 T(r)T(r) 是满足以下条件的结点集合:

  1. 结点 rr 属于 T(r)T(r)
  2. 若结点 xx 属于 T(r)T(r),则 xx 的所有子结点也属于 T(r)T(r)
  3. 其他结点均不属于 T(r)T(r)

T(r)T(r) 的大小记为 T(r)|T(r)|

绝妙置换与绝妙子树

T(r)T(r) 中结点的置换 v0,v1,,vT(r)1v_0, v_1, \ldots, v_{|T(r)|-1},定义:

  • 1i<T(r)1 \le i < |T(r)|f(i)f(i) 为颜色 C[vi]C[v_i] 在序列 C[v1],C[v2],,C[vi1]C[v_1], C[v_2], \ldots, C[v_{i-1}] 中出现的次数(f(1)=0f(1) = 0,因序列为空)。

该置换是绝妙置换当且仅当:

  1. v0=rv_0 = r
  2. 1i<T(r)1 \le i < |T(r)|,结点 viv_i 的父结点是 vf(i)v_{f(i)}(即 P[vi]=vf(i)P[v_i] = v_{f(i)})。

T(r)T(r) 中存在某个绝妙置换,则称 T(r)T(r)绝妙子树。注意,仅含单个结点的子树必为绝妙子树。

你的任务是判断树中每棵子树是否为绝妙子树,并返回结果数组。

实现细节

需在程序开始引入库 beechtree.h,并实现以下函数:

int[] beechtree(int N, int M, int[] P, int[] C)

参数说明

  • NN:树的结点总数;
  • MM:颜色总数;
  • PP:长度为 NN 的数组,P[i]P[i] 是结点 ii 的父结点(P[0]=1P[0] = -1);
  • CC:长度为 NN 的数组,C[i]C[i] 是边 ii 的颜色(C[0]=0C[0] = 0)。

返回要求

返回长度为 NN 的数组 bb,其中 b[r]=1b[r] = 1 表示 T(r)T(r) 是绝妙子树,b[r]=0b[r] = 0 表示不是。每个测试用例中,该函数仅被调用一次。

例子

例子 1

函数调用:

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

树结构中,T(1),T(2),T(3)T(1), T(2), T(3) 均为单结点子树(绝妙),T(0)T(0) 无绝妙置换(非绝妙)。返回数组为 [0,1,1,1][0, 1, 1, 1]

例子 2

函数调用对应题面中 N=18N=18 的树,返回数组为 $[0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]$。

例子 3

函数调用对应 N=7N=7 的树,仅 T(0)T(0) 非绝妙,返回数组为 [0,1,1,1,1,1,1][0, 1, 1, 1, 1, 1, 1]

约束条件

  • 3N2000003 \le N \le 200000
  • 2M2000002 \le M \le 200000
  • 1i<N1 \le i < N0P[i]<i0 \le P[i] < i1C[i]M1 \le C[i] \le M
  • P[0]=1P[0] = -1C[0]=0C[0] = 0

子任务

子任务 附加限制 分值
1 N8N \le 8M500M \le 500 99
2 树为链状(P[i]=i1P[i] = i-11i<N1 \le i < N 55
3 除结点 00 外,所有结点的父结点为 00 或父结点的父结点为 00 99
4 每种颜色的边至多 22 88
5 N200N \le 200M500M \le 500 1414
6 N2000N \le 2000M=2M = 2
7 N2000N \le 2000 1212
8 M=2M = 2 1717
9 无额外约束 1212

评测程序示例

输入格式

  1. 11 行:N  MN \; M
  2. 22 行:P[0]  P[1]    P[N1]P[0] \; P[1] \; \ldots \; P[N-1]
  3. 33 行:C[0]  C[1]    C[N1]C[0] \; C[1] \; \ldots \; C[N-1]

输出格式

11 行:函数返回的数组 bb 的元素,以空格分隔。