Submission #402992

#TimeUsernameProblemLanguageResultExecution timeMemory
402992ritul_kr_singhMergers (JOI19_mergers)C++17
100 / 100
1330 ms181876 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define sp << ' ' << #define nl << '\n' const int MAXN = 5e5; array<int, 20> p[MAXN]; vector<int> g[MAXN]; int t0[MAXN], d[MAXN], pre[MAXN], dfsTimer = 0; void dfs0(int u, int par, int dep){ t0[u] = dfsTimer++; p[u][0] = par, d[u] = dep; for(int i=0; i<19; ++i) p[u][i+1] = p[p[u][i]][i]; for(int v : g[u]) if(v != par) dfs0(v, u, dep + 1); } int lca(int u, int v){ if(d[u] < d[v]) swap(u, v); for(int i=0; i<20; ++i) if((d[u]-d[v]) & (1<<i)) u = p[u][i]; if(u == v) return u; for(int i=19; i>=0; --i) if(p[u][i] != p[v][i]) u = p[u][i], v = p[v][i]; return p[u][0]; } vector<int> e(MAXN, -1); int find(int u){ return e[u] < 0 ? u : e[u] = find(e[u]); } void unite(int u, int v){ u = find(u), v = find(v); if(u==v) return; if(e[u] > e[v]) swap(u, v); e[u] += e[v], e[v] = u; } void dfs1(int u){ for(int v : g[u]){ if(v == p[u][0]) continue; dfs1(v); pre[u] += pre[v]; if(pre[v]) unite(u, v); } } signed main(){ cin.tie(0)->sync_with_stdio(0); int n, k, u, v; cin >> n >> k; for(int i=1; i<n; ++i){ cin >> u >> v; --u, --v; g[u].push_back(v); g[v].push_back(u); } vector<int> c[k]; for(u=0; u<n; ++u) cin >> v, c[v-1].push_back(u); dfs0(0, 0, 0); for(auto &i : c){ sort(i.begin(), i.end(), [&](int x, int y){ return t0[x] < t0[y]; }); i.push_back(i.front()); for(int j=0; j+1<(int)i.size(); ++j){ ++pre[i[j]]; ++pre[i[j+1]]; pre[lca(i[j], i[j+1])] -= 2; } } dfs1(0); vector<int> h(n); for(int u=0; u<n; ++u) for(int v : g[u]) if(find(u) != find(v)) ++h[find(u)], ++h[find(v)]; int ans = 0; for(int u=0; u<n; ++u){ ans += find(u) == u && h[find(u)] == 2; } cout << (ans + 1) / 2; }
#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...