2-牛客周赛 Round 138题解

555 字
3 分钟
2-牛客周赛 Round 138题解

链接:https://ac.nowcoder.com/acm/contest/131111/D 来源:牛客网

小苯有一棵 nn 个节点的有根树,根为 11。每个节点 ii 有一个颜色 cic_i

小苯定义一条路径 uv,uvu \to v, u\neq vuuvv 的祖先)是“同色路径”,当且仅当路径上所有节点的颜色相同

注意:路径必须是祖先 \rightarrow 后代关系,且方向必须从祖先到后代。

小苯想知道,树中一共有多少条不同的同色路径。

你的任务是求出同色路径的数量。

输入描述:#

每个测试文件均包含多组测试数据。

第一行输入一个整数 T (1T105)T\ (1 \le T \le 10^5),代表数据组数,每组测试数据描述如下:

第一行包含一个整数 n (1n2×105)n\ (1 \le n \le 2 \times 10^5)

第二行包含 nn 个整数 c1,c2,,cn (1ci109)c_1, c_2, \dots, c_n\ (1 \le c_i \le 10^9)

接下来 n1n - 1 行,每行包含两个整数 ui,vi (1ui,vin)u_i, v_i\ (1 \le u_i, v_i \le n),表示树中有一条边 (ui,vi)(u_i, v_i),保证构成一棵以 11 为根的树。

除此之外,保证单个测试文件的 n2×105\sum n \le 2 \times 10^5

输出描述:#

对于每组测试数据: 输出一个整数,表示同色路径的数量。

示例1#

输入#

2
5
1 1 2 1 2
1 2
2 3
2 4
4 5
6
1 2 2 3 3 1
1 2
2 3
3 4
4 5
5 6

输出#

3
2

说明#

对于第一组测试数据,合法路径有:{12, 24, 124}\{1 \rightarrow 2,\ 2 \rightarrow 4,\ 1 \rightarrow 2 \rightarrow 4\},共 33 个。

对每个结点记录以该结点为结尾的最长路径长度,应为自顶向下的树形DP

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 1;
int c[N];
void solve() {
int n;cin>>n;
for (int i = 0; i < n; ++i) {
cin >> c[i];
}
vector<vector<int>> g(n);
vector<int> fa(n);
vector<int> dp(n);
for (int i = 1; i < n; ++i) {
int u, v;
cin >> u >> v;--u;--v;
g[u].push_back(v);
g[v].push_back(u);
}
queue<int> q;
q.push(0);
dp[0] = 1;
int ans = 0;
while (q.size()) {
int sz = q.size();
while (sz--) {
int t = q.front();
q.pop();
for (auto& son : g[t]) {
if (son != fa[t]) {
fa[son] = t;
if (c[son] == c[t]) {
dp[son] = dp[t] + 1;
ans += dp[t];
} else {
dp[son] = 1;
}
q.push(son);
}
}
}
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);
int t; cin>>t;
while (t--) {
solve();
}
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

2-牛客周赛 Round 138题解
https://skaco2.com/posts/03-solutions/2-牛客周赛-round-138题解/
作者
SKACO2
发布于
2026-04-16
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
SKACO2
Hello……
公告
欢迎来到我的博客!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
53
分类
8
标签
54
总字数
58,255
运行时长
0
最后活动
0 天前

目录