Submission #1320600

#TimeUsernameProblemLanguageResultExecution timeMemory
1320600wangzhiyi33Mergers (JOI19_mergers)C++20
100 / 100
733 ms113076 KiB
#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 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...