Submission #1159898

#TimeUsernameProblemLanguageResultExecution timeMemory
1159898trandangquangMergers (JOI19_mergers)C++20
100 / 100
560 ms98920 KiB
#include<bits/stdc++.h>
using namespace std;

#define ii pair<int,int>
#define fi first
#define se second
#define eb emplace_back

const int N=1000100;

int n,k,a[N],last[N];
int num[N],low[N],Time; bool bridge[N];
int idc[N],deg[N],curc;
vector<ii> ia[N];

void dfs(int u, int lid){
    num[u]=low[u]=++Time;
    for(auto [v,id]:ia[u]) if(id!=lid){
        if(!num[v]){
            dfs(v,id);
            low[u]=min(low[u],low[v]);

            if(low[v]>num[u]){
                bridge[id]=true;
            }
        }
        else{
            low[u]=min(low[u],num[v]);
        }
    }
}
void dfs2(int u){
    idc[u]=curc;
    for(auto [v,id]:ia[u]){
        if(bridge[id]){
            if(idc[v]){
                deg[idc[u]]++; deg[idc[v]]++;
            }
            continue;
        }
        if(!idc[v]) dfs2(v);
    }
}

int main(){
    cin>>n>>k;
    for(int i=1; i<n; ++i){
        int u,v; cin>>u>>v;
        ia[u].eb(v,i);
        ia[v].eb(u,i);
    }
    for(int i=1; i<=n; ++i){
        cin>>a[i];
        if(last[a[i]]!=0){
            ia[last[a[i]]].eb(i,i+n);
            ia[i].eb(last[a[i]],i+n);
        }
        last[a[i]]=i;
    }

    dfs(1,0);
    for(int i=1; i<=n; ++i) if(!idc[i]){
        ++curc;
        dfs2(i);
    }

    int res=0;
    for(int i=1; i<=curc; ++i) res+=deg[i]==1;
    cout<<(res+1)/2<<'\n';
}
#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...