Submission #887077

#TimeUsernameProblemLanguageResultExecution timeMemory
887077maxFedorchukMergers (JOI19_mergers)C++14
100 / 100
2062 ms217816 KiB
#include <bits/stdc++.h>
using namespace std;
 
const long long MX=5e5+10;
const long long lg=30;
 
vector < long long > mas[MX];
long long prd[lg][MX];
 
long long tin[MX],tou[MX];
long long timer=0;
 
void DFSCNT(long long zar,long long mun)
{
    timer++;
    tin[zar]=timer;
 
    prd[0][zar]=mun;
    for(long long i=1;i<lg;i++)
    {
        prd[i][zar]=prd[i-1][prd[i-1][zar]];
    }
 
    for(auto u:mas[zar])
    {
        if(u!=mun)
        {
            DFSCNT(u,zar);
        }
    }
 
    timer++;
    tou[zar]=timer;
 
    return;
}
 
long long ch_prd(long long pr,long long sn)
{
    return (tin[pr]<=tin[sn] && tou[sn]<=tou[pr]);
}
 
long long lca(long long a,long long b)
{
    if(ch_prd(a,b))
    {
        return a;
    }
 
    if(ch_prd(b,a))
    {
        return b;
    }
 
    for(long long i=lg-1;i>=0;i--)
    {
        if(!ch_prd(prd[i][a],b))
        {
            a=prd[i][a];
        }
    }
    a=prd[0][a];
 
    return a;
}
 
vector < long long > com[MX];
 
bool cmp(long long a,long long b)
{
    return (tin[a]<tin[b]);
}
 
long long prfsum[MX],ans=0;
 
long long DFS2(long long zar,long long mun)
{
    long long z=0;
 
    for(auto u:mas[zar])
    {
        if(u!=mun)
        {
            z+=DFS2(u,zar);
            prfsum[zar]+=prfsum[u];
        }
    }
 
    if(zar==1)
    {
        ans+=(z==1);
    }
    else
    {
        if(prfsum[zar]==0)
        {
            ans+=(z==0);
            z=1;
        }
    }
 
 
 
    return z;
}
 
int main()
{
    cin.tie(0);
    ios_base::sync_with_stdio(0);
 
    long long n,k;
    cin>>n>>k;
 
    long long a,b;
    for(long long i=1;i<n;i++)
    {
        cin>>a>>b;
        mas[a].push_back(b);
        mas[b].push_back(a);
    }
 
  	tin[0]=0;
    DFSCNT(1,0);
  	timer++;
  	tou[0]=timer;
 
    for(long long i=1;i<=n;i++)
    {
        cin>>a;
        com[a].push_back(i);
    }
 
    for(long long i=1;i<=k;i++)
    {
        sort(com[i].begin(),com[i].end(),cmp);
 
        long long sz=com[i].size();
        for(long long j=0;j<sz;j++)
        {
            prfsum[com[i][j]]++;
            prfsum[lca(com[i][j],com[i][(j+1)%sz])]--;
        }
    }
 
    DFS2(1,0);
 
    cout<<(ans+1)/2<<"\n";
    return 0;
}
#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...