#include<bits/stdc++.h>
using namespace std;
const int MXN = 5e5+2;
int n, k, dsu[MXN], sz[MXN], deg[MXN], sta[MXN];
vector<int> g[MXN];
inline void build() {
iota(dsu, dsu+n, 0);
fill(sz, sz+n, 1);
}
int find(int v) { return v==dsu[v] ? v : dsu[v]=find(dsu[v]); }
inline void merge(int u, int v) {
if((u=find(u))==(v=find(v))) return;
if(sz[u]<sz[v]) swap(u, v);
sz[dsu[v]=u] += sz[v];
}
int32_t main() {
cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
cin >> n >> k;
for(int i=0,u,v; i<n-1; i++) {
cin >> u >> v; u--; v--;
g[u].push_back(v);
g[v].push_back(u);
}
build();
fill(sta, sta+k, -1);
for(int i=0, s; i<n; i++) {
cin >> s;
if(sta[s]!=-1) merge(sta[s], i);
else sta[s] = i;
}
for(int i=0, ii, jj; i<n; i++)
for(int j : g[i])
if(i<j) {
ii = find(i), jj = find(j);
if(ii!=jj) deg[ii]++, deg[jj]++;
}
int ans=0;
for(int i=0; i<n; i++) ans += i==dsu[i] && deg[i]==1;
cout << ((ans+1)>>1) << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |