This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int N = 500005;
int n, k;
vector<int> states[N];
vector<int> adj[N];
int tin[N], tout[N], tid;
int up[N][20], dif[N];
int cnt[N], ans, huh[N];
void dfs1(int v, int p){
    up[v][0] = p;
    for(int i = 1; i<20; ++i)
        up[v][i] = up[up[v][i-1]][i-1];
    tin[v] = ++tid;
    for(auto u : adj[v])
        if(u!=p) dfs1(u, v);
    tout[v] = tid;
}
bool is_fa(int u, int v){
    return tin[u]<=tin[v] && tout[v]<=tout[u];
}
int lca(int u, int v){
    if(is_fa(u, v)) return u;
    if(is_fa(v, u)) return v;
    for(int i = 19; i>=0; --i)
        if(!is_fa(up[u][i], v)) 
            u = up[u][i];
    return up[u][0];
}
int dfs2(int v, int p){
    int sum = dif[v];
    for(auto u : adj[v]){
        if(u==p) continue;
        sum += dfs2(u, v);
        cnt[v] += cnt[u];
    }
    huh[v] = sum;
    if(v==0) return sum;
    cnt[v] += (sum==0);
    if(sum==0 && cnt[v]==1)
        ++ans;
    return sum;
}
int main(){
    // freopen("a.in", "r", stdin);
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> k;
    for(int i = 0; i<n-1; ++i){
        int u, v; cin >> u >> v;
        --u; --v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for(int i = 0; i<n; ++i){
        int x; cin >> x; --x;
        states[x].push_back(i);
    }
    dfs1(0, 0);
    for(int i = 0; i<k; ++i){
        int top = states[i][0];
        for(auto v : states[i])
            top = lca(top, v);
        for(auto v : states[i])
            ++dif[v], --dif[top];
    }
    dfs2(0, 0);
    for(int i = 1; i<n; ++i)
        if(huh[i]==0 && cnt[i]==cnt[0])
            ++ans;
    cout << (ans+1)/2 << '\n';
}
| # | 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... |