Submission #331842

#TimeUsernameProblemLanguageResultExecution timeMemory
331842EndRayMergers (JOI19_mergers)C++17
10 / 100
235 ms25976 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 start; int p[logN][N], h[N]; void dfs_init(int v, 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(int start){ p[0][start] = 0; h[start] = 0; dfs_init(start); 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 = 0; int dfs(int v, int pr=-1){ int w = color_lca[s[v]]; int fail = 0; for(int u : g[v]) if(u != pr){ int l = dfs(u, v); if(l < 0){ fail -= l; continue; } w = lca(l, w); } if(v == start && fail == 1){ ++ans; return -1; } if(fail) return -fail; if(v == w){ ++ans; return -1; } return w; } 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]; } for(int i = 0; i < n; ++i) if(g[i].size() > 1) start = i; init(start); 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(start); cout << (ans == 1 ? 0 : (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...