Submission #1155722

#TimeUsernameProblemLanguageResultExecution timeMemory
1155722fryingducMergers (JOI19_mergers)C++20
0 / 100
3096 ms29628 KiB
#include "bits/stdc++.h" using namespace std; #ifdef duc_debug #include "bits/debug.h" #else #define debug(...) #endif const int maxn = 5e5 + 5; int n, s[maxn], k; vector<int> g[maxn]; vector<int> grp[maxn]; int lab[maxn], par[maxn], h[maxn]; int deg[maxn]; int find(int u) { return lab[u] < 0 ? u : lab[u] = find(lab[u]); } void join(int u, int v) { u = find(u), v = find(v); if (u == v) return; if (lab[u] > lab[v]) swap(u, v); lab[u] += lab[v]; lab[v] = u; } void pre_dfs(int u, int prev) { for (auto v:g[u]) { if (v == prev) continue; par[v] = u; h[v] = h[u] + 1; pre_dfs(v, u); } } void solve() { cin >> n >> k; for (int i = 1; i < n; ++i) { int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } for (int i = 1; i <= n; ++i) { cin >> s[i]; grp[s[i]].push_back(i); lab[i] = -1; } pre_dfs(1, 0); for (int i = 1; i <= k; ++i) { if (grp[i].empty()) continue; for (int j = 1; j < (int)grp[i].size(); ++j) { int u = grp[i][j], v = grp[i][j - 1]; u = find(u), v = find(v); while (u != v) { if (h[u] > h[v]) swap(u, v); join(u, v); v = find(par[v]); } } } for (int i = 1; i <= n; ++i) { if (lab[i] < 0) { for (auto v:g[i]) { v = find(v); if (i != v) { ++deg[i]; } } } } int cnt = 0; for (int i = 1; i <= n; ++i) { cnt += (deg[i] == 1); } cout << (cnt + 1) / 2; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); solve(); 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...