Submission #331848

#TimeUsernameProblemLanguageResultExecution timeMemory
331848EndRayMergers (JOI19_mergers)C++17
100 / 100
1959 ms102380 KiB
#include<bits/stdc++.h> using namespace std; const int N = 5e5+1, logN = 19+1; int n, k; vector<int> g[N]; int s[N]; int p[logN][N], h[N]; void dfs_init(int v=0, int pr=-1){ for(int u : g[v]) if(u != pr){ p[0][u] = v; h[u] = h[v]+1; dfs_init(u, v); } } void init(){ p[0][0] = 0; h[0] = 0; dfs_init(); for(int d = 1; d < logN; ++d) for(int i = 0; i < n; ++i) p[d][i] = p[d-1][p[d-1][i]]; } int lca(int u, int v){ if(h[u] < h[v]) swap(u, v); int d = h[u] - h[v]; for(int i = 0; i < logN; ++i) if((d&(1<<i))) u = p[i][u]; for(int i = logN-1; i >= 0; --i) if(p[i][u] != p[i][v]){ u = p[i][u]; v = p[i][v]; } return (u == v ? u : p[0][u]); } int color_lca[N]; int ans; pair<int, int> dfs(int v=0, int pr=-1){ int w = color_lca[s[v]]; int deg = 0; for(int u : g[v]) if(u != pr){ pair<int, int> l = dfs(u, v); w = lca(l.first, w); deg += l.second; } if(v == w){ if(v) ++deg; if(deg == 1) ++ans; return {w, 1}; } return {w, deg}; } int main(){ ios_base::sync_with_stdio(false); cout.tie(0); cin.tie(0); cin >> n >> k; if(n == 2){ cout << k-1 << "\n"; return 0; } for(int i = 0; i < n-1; ++i){ int u, v; cin >> u >> v; --u; --v; g[u].push_back(v); g[v].push_back(u); } for(int i = 0; i < n; ++i){ cin >> s[i]; --s[i]; } init(); for(int i = 0; i < k; ++i) color_lca[i] = -1; for(int i = 0; i < n; ++i){ if(color_lca[s[i]] == -1) color_lca[s[i]] = i; color_lca[s[i]] = lca(i, color_lca[s[i]]); } dfs(); cout << (ans+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...