305 字
2 分钟
AtCoder ABC448_D: D - Integer-duplicated Path Editorial
AtCoder
2026-03-12

题目链接#

https://atcoder.jp/contests/abc448/tasks/abc448_d

题目大意#

给定一棵有 NN 个节点的树,第 ii 个节点上写着一个整数 AiA_i

对于每个 k=1,2,,Nk=1,2,\dots,N,考虑树上从节点 11 到节点 kk 的唯一路径,判断这条路径上是否存在两个不同节点写着相同的整数。

如果存在,输出 Yes;否则输出 No

解题思路#

如果用 BFS 来为每个节点维护一个 set 集合的话,毫无疑问会 MLE,所以我们要使用 DFS。对树上的点进行遍历,具体做法就是到达一个点后,先判断它的父节点是否已经重复;如果已经重复,就直接标记即可;如果没有重复,就用 unordered_map 统计这个点的值出现的次数,判断当前路径上是否出现重复,再继续 DFS,回溯时记得在 map 上减掉这个值的数量即可。

代码实现#

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
vector<int> q[N];
bool success[N];
unordered_map<int, int> m;
int n, u, v;
void dfs(int u, int fa){
for(int t:q[u]){
if(t==fa) continue;
m[a[t]]++;
if(success[u]) success[t]=true;
if(m[a[t]]>=2) success[t]=true;
dfs(t, u);
m[a[t]]--;
}
}
int main(){
scanf("%d", &n);
for(int i=1;i<=n;i++) scanf("%d", &a[i]);
for(int i=1;i<=n-1;i++){
scanf("%d%d", &u, &v);
q[u].push_back(v), q[v].push_back(u);
}
m[a[1]]++;
dfs(1, -1);
for(int i=1;i<=n;i++){
if(success[i]==false) printf("No\n");
else printf("Yes\n");
}
return 0;
}
AtCoder ABC448_D: D - Integer-duplicated Path Editorial
https://shenyize.com/posts/atcoder/abc448_d/
作者
Shenyize
发布于
2026-03-12
许可协议
CC BY-NC-SA 4.0