B
只要存在一段颜色相同且长度 (ge k) 的就合法。易证
C
略
D
直接贪心就好了。每次选最小的 (a_i) 往最左边的空位塞 (i-1) 个 (i)。看看是否出现不合法的情况。(a_i) 右边的 (i) 同理。
E
这里就说一下大致思路。
将 (i o a_i) 连边构成的图称为 (G),(i o p_i) 连边构成的图称为 (G')。原问题给出 (G) ,问有多少种 (G')。但我们发现,(a_i) 不是排列,所以 (G) 的形状并不优美,那么不妨考虑对于某个 (G') 能得到怎样的 (G),然后再倒回来考虑每种情况对答案的贡献。简单来说,就是倒两次。
F
设 (f(x,d)) 为 (dist(x,y) le d) 的所有 (y) 构成的集合。对于相同的 (f(*,*)) 我们只在 (d) 最小的那个计算贡献,可以发现,对于所有不是全集的 (f(*,*)),这样的 (d) 存在且唯一,对于全集在最后 (+1) ,做到了不重不漏。若 (f(x,d)) 的贡献被计算,需要满足什么条件?
先假设所有点都是特殊点。条件Ⅰ: (f(x,d)) 不是全集 ( o) (d<max{dist(x,y)});条件Ⅱ:对于所有与 (x) 相邻的 (y),(f(x,d) eq f(y,d-1)),这个条件同样可以用 (dist) 的形式表达。那么一遍树形(换根)dp 算出所有 (x) 的 (d) 的上界,加起来就好了。
现在有一些点不是特殊点。对于特殊点,仍然按上述方法处理。对于非特殊点 (x),求出 (d) 的上界以后,我们还要知道哪些 (f(x,d)=f(y,d')),(y) 为特殊点。只有这些 (f(x,d)) 有 (1) 的贡献。此时以 (x) 为根,(f(x,d)) 必须包含 (y) 所在的 (x) 的儿子子树内所有点。
稍微证明一下上面那个结论的必要性,由上述定义得到 (d) 是当前集合的最小值,即 (x) 为子集 (f(x,d)) 的直径中点,那么直径经过 (x) 的两个不同儿子。设 (y) 所在的 (x) 的儿子子树为 (subtree(p),pin son(x)),若 (subtree(p)) 没有全被覆盖,那么直径有一端在 (subtree(p)) 中,设这个端点为 (A),另一个端点为 (B),因为 (yin subtree(p),dist(x,A)=dist(x,B)),所以 (dist(y,A)<dist(y,B)),而与 (A) 相邻的节点没有全被覆盖,所以不存在 (f(y,d')=f(x,d))。充分性显然。
然后使用换根 dp,复杂度 (O(n))。