Submission #1178116

#TimeUsernameProblemLanguageResultExecution timeMemory
1178116AlgorithmWarriorMergers (JOI19_mergers)C++20
0 / 100
58 ms17528 KiB
#include <bits/stdc++.h>

using namespace std;

int const MAX=500005;
int color[MAX];
int n,k;
vector<int>tree[MAX];
int lcol[MAX],rcol[MAX];
int l[MAX],r[MAX];
int frunze;
struct answer{
    int fii,st,dr;
};

void read(){
    cin>>n>>k;
    int i;
    for(i=1;i<n;++i){
        int u,v;
        cin>>u>>v;
        tree[u].push_back(v);
        tree[v].push_back(u);
    }
    for(i=1;i<=n;++i)
        cin>>color[i];
}

void minself(int& x,int val){
    if(x>val)
        x=val;
}

void maxself(int& x,int val){
    if(x<val)
        x=val;
}

void euler(int nod,int tata){
    static int time=0;
    l[nod]=++time;
    for(auto fiu : tree[nod])
        if(fiu!=tata)
            euler(fiu,nod);
    r[nod]=++time;
    minself(lcol[color[nod]],l[nod]);
    maxself(rcol[color[nod]],r[nod]);
}

void init(){
    int i;
    for(i=1;i<=k;++i){
        lcol[i]=n+1;
        rcol[i]=0;
    }
}

answer dfs(int nod,int tata){
    int nrf=0;
    int st=n+1,dr=0;
    for(auto fiu : tree[nod])
        if(fiu!=tata){
            answer ans=dfs(fiu,nod);
            nrf+=ans.fii;
            minself(st,ans.st);
            maxself(dr,ans.dr);
        }
    minself(st,lcol[color[nod]]);
    maxself(dr,rcol[color[nod]]);
    if(st==l[nod] && dr==r[nod]){
        if((nrf==0 && nod!=1) || (nrf==1 && nod==1))
            ++frunze;
        return {1,n+1,0};
    }
    return {nrf,st,dr};
}

int main()
{
    read();
    init();
    euler(1,0);
    dfs(1,0);
    cout<<(frunze+1)/2;
    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...