제출 #886319

#제출 시각아이디문제언어결과실행 시간메모리
886319maxFedorchukMergers (JOI19_mergers)C++14
0 / 100
98 ms125256 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);
    }

    DFSCNT(1,0);

    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...