Submission #1155462

#TimeUsernameProblemLanguageResultExecution timeMemory
1155462ivazivaCapital City (JOI20_capital_city)C++20
0 / 100
413 ms33196 KiB
#include <bits/stdc++.h>

using namespace std;

#define MAXN 200001

int n,k;
vector<int> adj[MAXN];
int c[MAXN],promenjeno[MAXN],siz[MAXN];
bool uklonjeno[MAXN];
map<int,int> mapa;
int ans=0,boja;

void subtree_size(int node,int pret)
{
    siz[node]=1;
    for (int sled:adj[node])
    {
        if (sled==pret or uklonjeno[sled]) continue;
        subtree_size(sled,node);siz[node]+=siz[sled];
    }
}

int get_centroid(int node,int pret,int val)
{
    for (int sled:adj[node])
    {
        if (sled==pret or uklonjeno[sled]) continue;
        if (siz[sled]*2>val) return get_centroid(sled,node,val);
    }
    return node;
}

void racunaj(int node,int pret,int maxvalue)
{
    if (mapa.find(promenjeno[c[node]])==mapa.end()) mapa[promenjeno[c[node]]]=1;
    else if (mapa[promenjeno[c[node]]]<maxvalue) {mapa[promenjeno[c[node]]]++;boja=min(boja,promenjeno[c[node]]);}
    for (int sled:adj[node])
    {
        if (sled==pret or uklonjeno[sled]) continue;
        racunaj(sled,node,maxvalue);
    }
}

void centroid_decomposition(int node)
{
    subtree_size(node,-1);
    int centroida=get_centroid(node,-1,siz[node]);uklonjeno[centroida]=true;
    boja=INT_MAX;int broj=1;
    for (int sled:adj[centroida])
    {
        if (uklonjeno[sled]) continue;
        racunaj(sled,centroida,broj);broj++;if (boja!=INT_MAX) break;
    }
    mapa.clear();
    if (boja!=INT_MAX) {promenjeno[c[centroida]]=boja;ans++;}
    for (int sled:adj[node])
    {
        if (!uklonjeno[sled]) centroid_decomposition(sled);
    }
}

int main()
{
    cin>>n>>k;
    for (int i=1;i<n;i++) {int x,y;cin>>x>>y;adj[x].push_back(y);adj[y].push_back(x);}
    for (int i=1;i<=n;i++) cin>>c[i];
    for (int i=1;i<=k;i++) promenjeno[i]=i;
    centroid_decomposition(1);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...