P17275 [eJOI 2026] Teamfulness

题目描述

EJOI 期间,Anton 在 Kaunas 散步时发现了 $N$ 个参赛者聚集点,编号为 $0$ 到 $N-1$。每个地点恰好由一支队伍的成员占据,队伍编号为 $0$ 到 $K-1$。同一支队伍的成员可以占据任意多个地点,也可能有队伍不占据任何地点。 这些地点由 $N-1$ 条双向道路连接,并且任意两个地点之间都恰好存在一条简单路径,因此它们构成一棵树。简单路径是一个由互不相同的地点组成的序列,其中每两个相邻地点之间都有道路。路径长度是它使用的道路数,也就是经过的地点数减 $1$。 Anton 想沿一条简单路径散步,并经过尽可能多的地点。如果一条简单路径的长度在树中所有简单路径里最大,则称它是**有趣路径**。一条路径的**团队丰富度**是 Anton 沿途遇到的不同队伍数量。 请计算所有不同有趣路径的团队丰富度之和。当且仅当两条有趣路径经过的地点集合完全相同时,它们才被视为同一条路径。特别地,反向经过一条路径不会产生新的路径。 ### 实现细节 你需要实现以下函数: ```cpp long long teamfulness(int N, int K, std::vector a, std::vector u, std::vector v) ``` - $N$:地点数; - $K$:队伍数; - $a$:长度为 $N$ 的数组,其中 $a_i$ 表示占据地点 $i$ 的队伍; - $u,v$:长度为 $N-1$ 的数组,其中 $u_i$ 和 $v_i$ 是第 $i$ 条道路连接的两个地点。 每个测试中,该函数恰好调用一次,并且必须返回所有有趣路径的团队丰富度之和。

输入格式

输入格式: - 第 $1$ 行:两个整数 $N$ 和 $K$; - 第 $2$ 行:$N$ 个整数 $a_0,a_1,\ldots,a_{N-1}$; - 第 $3+i$ 行:两个整数 $u_i$ 和 $v_i$,即第 $i$ 条道路的两个端点。

输出格式

输出格式: - 第 $1$ 行:函数的返回值。

说明/提示

### 样例 1 解释 简单路径的最大长度为 $2$,因此有趣路径包含 $2$ 条道路和 $3$ 个地点。团队丰富度为 $3$ 的有趣路径有 $2$ 条,团队丰富度为 $2$ 的有 $7$ 条,团队丰富度为 $1$ 的有 $1$ 条,总和为 $21$。 ### 样例 2 解释 图中队伍 $0$ 用黄色表示: :::align{center} ![样例 2 的树](https://cdn.luogu.com.cn/upload/image_hosting/53g8rxd0.png) ::: 由于所有地点都属于唯一的一支队伍,每条路径的团队丰富度均为 $1$。长度为 $4$ 的有趣路径共有 $4$ 条,因此总和为 $4$。 ### 样例 3 解释 图中队伍 $0$ 为黄色,队伍 $1$ 为绿色,队伍 $2$ 为红色: :::align{center} ![样例 3 的树](https://cdn.luogu.com.cn/upload/image_hosting/908fix41.png) ::: 有趣路径的长度为 $3$。共有 $4$ 条有趣路径,其中 $3$ 条的团队丰富度为 $3$,另 $1$ 条为 $2$,总和为 $11$。 ### 限制 - $3\le N\le 10^6$ - $1\le K\le N$ - 对每个 $0\le i