#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=5e5;
int n,k;
vector<int>adj[maxn+2],grup[maxn+2];
int dep[maxn+2],par[maxn+2];
void dfs(int cur,int p){
dep[cur]=dep[p]+1;
par[cur]=p;
for(auto x : adj[cur]){
if(x==p)continue;
dfs(x,cur);
}
}
int dsu[maxn+2];
int fin(int a){
if(dsu[a]==a)return a;
return dsu[a]=fin(dsu[a]);
}
void merg(int a,int b){
a=fin(a),b=fin(b);
if(a==b)return;
dsu[a]=b;
}
void comb(int a,int b){
a=fin(a),b=fin(b);
while(a!=b){
if(dep[a]<dep[b])swap(a,b);
merg(a,par[a]);
a=fin(a);
}
}
signed main(){
cin>>n>>k;
for(int q=1;q<n;q++){
int u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int q=1;q<=n;q++){
int x;cin>>x;
grup[x].push_back(q);
dsu[q]=q;
}
dfs(1,0);
for(int q=1;q<=k;q++){
for(auto y : grup[q]){
comb(grup[q].back(),y);
}
}
vector<int>baru[n+2];
for(int q=1;q<=n;q++){
for(auto x : adj[q]){
if(fin(x)!=fin(q)){
baru[fin(q)].push_back(fin(x));
baru[fin(x)].push_back(fin(q));
}
}
}
int tot=0;
for(int q=1;q<=n;q++){
if(baru[q].size()==2)tot++;
}
cout<<(tot+1)/2<<endl;
}
| # | 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... |