Submission #1180045

#TimeUsernameProblemLanguageResultExecution timeMemory
1180045Hamed_GhaffariMergers (JOI19_mergers)C++20
100 / 100
233 ms57524 KiB
#include<bits/stdc++.h> using namespace std; const int MXN = 5e5+2; int n, k, dsu[MXN], h[MXN], deg[MXN], sta[MXN], par[MXN]; vector<int> g[MXN]; void dfs(int v, int p=-1) { for(int u : g[v]) if(u!=p) par[u] = v, h[u] = h[v]+1, dfs(u, v); } int find(int v) { return v==dsu[v] ? v : dsu[v]=find(dsu[v]); } void merge(int u, int v) { u = find(u), v = find(v); while(u!=v) { if(h[u]<h[v]) swap(u, v); dsu[u] = par[u]; u = find(u); } } int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin >> n >> k; for(int i=0,u,v; i<n-1; i++) { cin >> u >> v; u--; v--; g[u].push_back(v); g[v].push_back(u); } dfs(0); fill(sta, sta+k, -1); iota(dsu, dsu+n, 0); for(int i=0, s; i<n; i++) { cin >> s; s--; if(sta[s]!=-1) merge(sta[s], i); else sta[s] = i; } for(int i=0, ii, jj; i<n; i++) for(int j : g[i]) if(i<j) { ii = find(i), jj = find(j); if(ii!=jj) deg[ii]++, deg[jj]++; } int ans=0; for(int i=0; i<n; i++) ans += i==dsu[i] && deg[i]==1; cout << ((ans+1)>>1) << '\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...