Submission #1351056

#TimeUsernameProblemLanguageResultExecution timeMemory
1351056kokokaiCapital City (JOI20_capital_city)C++20
100 / 100
390 ms36456 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "text"
const int N = 2e5+5;
const int LG = 19;
vector<int> adj[N],posi[N];
int C[N],sz[N],del[N],vis[N];
int n,K;
void dfs(int u,int p){
    sz[u]=1;
    for(int v:adj[u]){
        if(v==p || del[v]) continue;
        dfs(v,u);
        sz[u] += sz[v];
    }
}
int findcent(int u,int p,int need){
    for(int v:adj[u]){
        if(v==p || del[v]) continue;
        if(sz[v]>need/2) return findcent(v,u,need);
    }
    return u;
}
int cnt[N],par[N];
void cle(int u,int p){
    cnt[C[u]]=0;
    vis[C[u]]=0;
    par[u]=p;
    for(int v:adj[u]){
        if(v==p || del[v]) continue;
        cle(v,u);
    }
}
void dfs1(int u,int p){
    cnt[C[u]]++;
    for(int v:adj[u]){
        if(v==p || del[v]) continue;
        dfs1(v,u);
    }
}
int ans=1e9;
void decomp(int u,int p){
    dfs(u,0);
    u=findcent(u,0,sz[u]);
    del[u]=1;
    cle(u,0);
    dfs1(u,0);
    queue<int> q;
    int res=0;
    q.push(C[u]);
    //cerr<<u<<'\n';
    while(!q.empty()){
        int col=q.front();
        q.pop();

        if(cnt[col] != posi[col].size()){
            res=1e9;
            break;
        }
        if(vis[col]) continue;
        vis[col]=1;
        res++;
        for(int v:posi[col]){
            if(par[v]) q.push(C[par[v]]);
        }
    }
    ans=min(ans,res-1);
    for(int v:adj[u]){
        if(v==p || del[v]) continue;
        decomp(v,u);
    }
}
int main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    if(fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
        //freopen(task".out","w",stdout);
    }
    cin>>n>>K;
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        cin>>C[i];
        posi[C[i]].push_back(i);
    }
    decomp(1,0);
    cout<<ans<<'\n';
}




Compilation message (stderr)

capital_city.cpp: In function 'int main()':
capital_city.cpp:79:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...