闲扯
这题之前不是绿题吗,怎么 突然紫了。。。
题面
Solution
这道题的要做的事是很清晰的:给定一些点,问是否存在一条简单路径 $(u,v)$ 满足所有的点都在该路径上。如果有,请输出这种路径的个数。
显然,这题的难点就在于怎么判断是否存在,至于方案,是很好计算的。
因为每个点的颜色不同,我们可以在计算点 $u$ 时,只看 $col_u$ 即可(主要是我自己做的时候一直很脑残,没想出来怎么搞)。
首先我们要明确的一点是:每一条链,它一定存在两个端点(端点定义为:它的子树中,除了自己有 $cnt_{col}-1$ 个颜色为 $col$ 的节点或者它的子树中没有相同颜色节点)。
分析一下合法的情况有哪些。
- 没有这种颜色,答案为 $\frac{n\cdot(n-1)}{2}$ 。
- 这种颜色只有一个点,答案为 $n-1+\sum_{i=1}^{tot}\sum_{j=1}^{i-1}sz_i\cdot sz_j$ ,其中 $tot$ 表示该节点子树的个数(包括整棵树除去以该节点为根结点的子树的部分), $sz$ 表示该节点的子树的大小。
- 恰好存在两个端点,且它们的 $LCA$ 不为其中的任何一个,答案为 $sz_u\cdot sz_v$ 。
- 恰好存在两个端点,且它们的 $LCA$ 为其中的一个(假设为 $u$ ),答案为 $sz_v\cdot (n-sz_{to})$ 。其中 $to$ 表示 $u$ 的子节点中,子树包含 $v$ 的那一个。
而不合法的情况就是对于一种颜色,存在两个以上的端点。
所以我们只需要对于每种情况讨论一下,统计答案即可。
Code
1 |
|
总结
感觉挺巧妙的一道题,主要是搞懂有几种情况,及什么时候出现这些情况。