| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 1178853 | irmuun | Mergers (JOI19_mergers) | C++20 | 1360 ms | 150688 KiB | 
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()
const ll N=5e5+5;
ll n,k;
vector<ll>g[N];
ll s[N],par[N],cnt[N],col[N],sub[N],ex[N];
bool flag[N];
void dfs(ll x,ll p){
    par[x]=p;
    sub[x]=1;
    for(ll y:g[x]){
        if(y!=p){
            dfs(y,x);
            sub[x]+=sub[y];
        }
    }
}
set<ll>solve(ll x){
    set<ll>colors;
    vector<set<ll>>v;
    ll j=-1,mx=0;
    for(ll y:g[x]){
        if(y!=par[x]){
            v.pb(solve(y));
            if(v.back().size()>mx){
                mx=v.back().size();
                j=v.size()-1;
                ex[x]=ex[y];
            }
        }
    }
    v.pb({s[x]});
    if(j>-1){
        swap(colors,v[j]);
    }
    for(ll i=0;i<v.size();i++){
        if(i!=j){
            for(ll c:v[i]){
                if(colors.count(c)==0){
                    colors.insert(c);
                    ex[x]+=cnt[c];
                }
            }
        }
    }
    if(ex[x]==sub[x]){
        flag[x]=true;
    }
    return colors;
}
ll go(){
    queue<ll>r;//roots
    r.push(1);
    ll cur=0;
    while(!r.empty()){
        ll x=r.front();
        r.pop();
        cur++;
        queue<ll>q;
        q.push(x);
        while(!q.empty()){
            ll i=q.front();
            q.pop();
            col[i]=cur;
            for(ll j:g[i]){
                if(j==par[i]) continue;
                if(flag[j]){
                    r.push(j);
                }
                else{
                    q.push(j);
                }
            }
        }
    }
    for(ll i=1;i<=n;i++){
        g[i].clear();
    }
    for(ll i=2;i<=n;i++){
        if(flag[i]){
            g[col[i]].pb(col[par[i]]);
            g[col[par[i]]].pb(col[i]);
        }
    }
    ll leaf=0;
    for(ll i=1;i<=cur;i++){
        if(g[i].size()==1){
            leaf++;
        }
    }
    return leaf;
}
int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n>>k;
    for(ll i=1;i<n;i++){
        ll a,b;
        cin>>a>>b;
        g[a].pb(b);
        g[b].pb(a);
    }
    for(ll i=1;i<=n;i++){
        cin>>s[i];
        cnt[s[i]]++;
    }
    dfs(1,1);
    fill(flag,flag+N+1,false);
    solve(1);
    ll leaf=go();
    cout<<(leaf+1)/2;
}
Compilation message (stderr)
| # | 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... | ||||
