Submission #129917

#TimeUsernameProblemLanguageResultExecution timeMemory
129917dooweyMergers (JOI19_mergers)C++14
100 / 100
913 ms82492 KiB
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ld, ld> pdd;
 
#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const int N = (int)5e5 + 9;

int pi[N];
int fin(int x){
    if(pi[x] == x)
        return x;
    return pi[x]=fin(pi[x]);
}

void unite(int a, int b){
    a=fin(a);
    b=fin(b);
    if(a==b)
        return;
    pi[a] = b;
}

vector<int> T[N];
int dep[N];
int par[N];

void dfs(int u, int pr){
    par[u] = pr;
    for(auto p : T[u]){
        if(p == pr) continue;
        dep[p] = dep[u] + 1;
        dfs(p, u);
    }
}

vector<int> col[N];

void path(int a, int b){
    a = fin(a);
    b = fin(b);
    while(a != b){
        if(dep[a] < dep[b]) swap(a, b);
        unite(a, par[a]);
        a = fin(a);
        b = fin(b);
    }
}

int deg[N];

int main(){
    fastIO;
    int n,k;
    cin >> n >> k;
    int u, v;
    for(int i = 2; i <= n; i ++ ){
        cin >> u >> v;
        T[u].push_back(v);
        T[v].push_back(u);
    }
    dfs(1, -1);
    int cl;
    for(int i = 1; i <= n; i ++ ){
        cin >> cl;
        col[cl].push_back(i);
    }
    for(int i = 1; i <= n; i ++ )
        pi[i] = i;
    for(int i = 1; i <= k ; i ++ ){
        for(auto p : col[i]){
            path(col[i][0], p);
        }
    }
    for(int i = 1; i <= n; i ++ )
        for(auto p : T[i])
            if(fin(i) != fin(p))
                deg[fin(p)] ++ ;
    int sz = 0;
    for(int i = 1; i <= n; i ++ )
        if(deg[i] == 1)
            sz ++ ;
    cout << (sz + 1) / 2;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...