vector< int > adj[maxn]; ll a[maxn]; bool ans[maxn]; int n;
map< ll, int > cnt;
// 树上 DFS 一般传两个参数,当前节点 u,以及父节点 p ( 为了防止往回搜 u -> p -> u ) voiddfs( int u, int p, bool flag ) { // 当前路径到当前点 u 是否存在重复的情况。 bool cur = ( flag || ( cnt[a[u]] > 0 ) ); ans[u] = cur; cnt[a[u]] += 1; for( int v : adj[u] ) { if( v == p ) continue; dfs( v, u, cur ); } // 重点回溯 cnt[a[u]] -= 1; }
voidsolve( ) { cin >> n; for( int i = 1; i <= n; ++ i ) cin >> a[i];
// 朴实的邻接表存图 for( int i = 1; i <= n - 1; ++ i ) { int u, v; cin >> u >> v; adj[u].push_back( v ); adj[v].push_back( u ); }
cnt.clear( );
dfs( 1, 0, 0 );
for( int i = 1; i <= n; ++ i ) { if( ans[i] ) cout << "Yes" << '\n'; else cout << "No" << '\n'; } }