Submission #1333553

#TimeUsernameProblemLanguageResultExecution timeMemory
1333553wangzhiyi33Capital City (JOI20_capital_city)C++20
100 / 100
383 ms35184 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back

const int maxn=2e5;
int n,k;
int c[maxn+2];
vector<int>adj[maxn+2];
vector<int>elem[maxn+2];

int sub[maxn+2]; bool vis[maxn+2];
bool col[maxn+2];
int cnt[maxn+2];

void dfs(int cur,int par){
    sub[cur]=1;
    col[c[cur]]=false; cnt[c[cur]]=0;

    for(auto x : adj[cur]){
        if(x==par || vis[x])continue;
        dfs(x,cur);
        sub[cur]+=sub[x];
    }
}

int centro(int cur,int par,int sz){
    for(auto x : adj[cur]){
        if(x==par || vis[x])continue;
        if(sub[x]>=sz/2){
            return centro(x,cur,sz);
        }
    }
    return cur;
}

int par[maxn+2];
void build(int cur,int p){
    cnt[c[cur]]++;
    par[cur]=p;

    for(auto x : adj[cur]){
        if(x==p || vis[x])continue;
        build(x,cur);
    }
}

int tmp=0;
queue<int>qq;

void msk(int apa){
    if(col[apa])return;
    col[apa]=true; tmp++;

    if(cnt[apa]!=elem[apa].size()){
        tmp=1e9; return;
    }
    for(auto x : elem[apa]){
        qq.push(x);
    }
}

int ans;
void solve(int cur,int p){
    dfs(cur,p);
    int root=centro(cur,p,sub[cur]);
    build(root,0);
    tmp=0;

    msk(c[root]);
    while(qq.size()){
        int hmm=qq.front(); qq.pop();
        if(par[hmm]){
            msk(c[par[hmm]]);
        }
    }

    //cout<<tmp<<" "<<cur<<endl;
    ans=min(ans,tmp-1);
    vis[root]=true;

    for(auto x : adj[root]){
        if(vis[x])continue;
        solve(x,root);
    }
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>k;
    for(int q=1;q<n;q++){
        int u,v;
        cin>>u>>v;
        adj[u].pb(v); adj[v].pb(u);
    }
    for(int q=1;q<=n;q++){
        cin>>c[q];
        elem[c[q]].pb(q);
    }
    ans=k-1;
    solve(1,0);
    cout<<ans<<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...