Submission #1180042

#TimeUsernameProblemLanguageResultExecution timeMemory
1180042Hamed_GhaffariMergers (JOI19_mergers)C++20
0 / 100
28 ms17088 KiB
#include<bits/stdc++.h> using namespace std; const int MXN = 5e5+2; int n, k, dsu[MXN], sz[MXN], deg[MXN], sta[MXN]; vector<int> g[MXN]; inline void build() { iota(dsu, dsu+n, 0); fill(sz, sz+n, 1); } int find(int v) { return v==dsu[v] ? v : dsu[v]=find(dsu[v]); } inline void merge(int u, int v) { if((u=find(u))==(v=find(v))) return; if(sz[u]<sz[v]) swap(u, v); sz[dsu[v]=u] += sz[v]; } 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); } build(); fill(sta, sta+k, -1); for(int i=0, s; i<n; i++) { cin >> 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...