#P17275. [eJOI 2026] Teamfulness

    ID: 19752 远端评测题 4000ms 1024MiB 尝试: 0 已通过: 0 显示难度提高+/省选− 上传者: 标签>交互题Special JudgeeJOI(欧洲)2026

[eJOI 2026] Teamfulness

题目描述

EJOI 期间,Anton 在 Kaunas 散步时发现了 NN 个参赛者聚集点,编号为 00 到 N−1N-1。每个地点恰好由一支队伍的成员占据,队伍编号为 00 到 K−1K-1。同一支队伍的成员可以占据任意多个地点,也可能有队伍不占据任何地点。

这些地点由 N−1N-1 条双向道路连接,并且任意两个地点之间都恰好存在一条简单路径,因此它们构成一棵树。简单路径是一个由互不相同的地点组成的序列,其中每两个相邻地点之间都有道路。路径长度是它使用的道路数,也就是经过的地点数减 11。

Anton 想沿一条简单路径散步,并经过尽可能多的地点。如果一条简单路径的长度在树中所有简单路径里最大,则称它是有趣路径。一条路径的团队丰富度是 Anton 沿途遇到的不同队伍数量。

请计算所有不同有趣路径的团队丰富度之和。当且仅当两条有趣路径经过的地点集合完全相同时,它们才被视为同一条路径。特别地,反向经过一条路径不会产生新的路径。

实现细节

你需要实现以下函数:

long long teamfulness(int N, int K, std::vector<int> a,
                      std::vector<int> u, std::vector<int> v)
  • NN:地点数;
  • KK:队伍数;
  • aa:长度为 NN 的数组,其中 aia_i 表示占据地点 ii 的队伍;
  • u,vu,v:长度为 N−1N-1 的数组,其中 uiu_i 和 viv_i 是第 ii 条道路连接的两个地点。

每个测试中,该函数恰好调用一次,并且必须返回所有有趣路径的团队丰富度之和。

输入格式

输入格式:

  • 第 11 行:两个整数 NN 和 KK;
  • 第 22 行:NN 个整数 a0,a1,…,aN−1a_0,a_1,\ldots,a_{N-1};
  • 第 3+i3+i 行:两个整数 uiu_i 和 viv_i,即第 ii 条道路的两个端点。

输出格式

输出格式:

  • 第 11 行:函数的返回值。
6 3
1 0 0 1 2 1
0 1
0 2
0 3
0 4
0 5
21
7 1
0 0 0 0 0 0 0
0 1
0 2
1 3
1 4
2 5
2 6
4
6 3
0 1 2 0 1 2
0 1
1 2
2 3
1 4
2 5
11

提示

样例 1 解释

简单路径的最大长度为 22,因此有趣路径包含 22 条道路和 33 个地点。团队丰富度为 33 的有趣路径有 22 条,团队丰富度为 22 的有 77 条,团队丰富度为 11 的有 11 条,总和为 2121。

样例 2 解释

图中队伍 00 用黄色表示:

:::align{center} 样例 2 的树 :::

由于所有地点都属于唯一的一支队伍,每条路径的团队丰富度均为 11。长度为 44 的有趣路径共有 44 条,因此总和为 44。

样例 3 解释

图中队伍 00 为黄色,队伍 11 为绿色,队伍 22 为红色:

:::align{center} 样例 3 的树 :::

有趣路径的长度为 33。共有 44 条有趣路径,其中 33 条的团队丰富度为 33,另 11 条为 22,总和为 1111。

限制

  • 3≤N≤1063\le N\le 10^6
  • 1≤K≤N1\le K\le N
  • 对每个 0≤i<N0\le i<N,均有 0≤ai<K0\le a_i<K
  • 对每个 0≤i<N−10\le i<N-1,均有 0≤ui,vi<N0\le u_i,v_i<N

子任务

子任务 分值 NN KK 附加限制
0 - 样例。
1 4 ≤106\le 10^6 ≤N\le N 每个地点最多与另外两个地点直接相连。
2 7 存在一个地点与其他所有地点直接相连。
3 9 ≤200\le 200 -
4 10 ≤2⋅103\le 2\cdot 10^3
5 ≤106\le 10^6 =1=1
6 9 ≤2\le 2
7 11 ≤2⋅105\le 2\cdot 10^5 ≤50\le 50
8 12 ≤N\le N
9 13 ≤106\le 10^6 有趣路径的长度为奇数。
10 15 -