제출 #512634

#제출 시각아이디문제언어결과실행 시간메모리
512634couplefireMergers (JOI19_mergers)C++17
100 / 100
922 ms137568 KiB
#include <bits/stdc++.h> using namespace std; const int N = 500005; int n, k; vector<int> states[N]; vector<int> adj[N]; int tin[N], tout[N], tid; int up[N][20], dif[N]; int cnt[N], ans, huh[N]; void dfs1(int v, int p){ up[v][0] = p; for(int i = 1; i<20; ++i) up[v][i] = up[up[v][i-1]][i-1]; tin[v] = ++tid; for(auto u : adj[v]) if(u!=p) dfs1(u, v); tout[v] = tid; } bool is_fa(int u, int v){ return tin[u]<=tin[v] && tout[v]<=tout[u]; } int lca(int u, int v){ if(is_fa(u, v)) return u; if(is_fa(v, u)) return v; for(int i = 19; i>=0; --i) if(!is_fa(up[u][i], v)) u = up[u][i]; return up[u][0]; } int dfs2(int v, int p){ int sum = dif[v]; for(auto u : adj[v]){ if(u==p) continue; sum += dfs2(u, v); cnt[v] += cnt[u]; } huh[v] = sum; if(v==0) return sum; cnt[v] += (sum==0); if(sum==0 && cnt[v]==1) ++ans; return sum; } int main(){ // freopen("a.in", "r", stdin); cin.tie(0)->sync_with_stdio(0); cin >> n >> k; for(int i = 0; i<n-1; ++i){ int u, v; cin >> u >> v; --u; --v; adj[u].push_back(v); adj[v].push_back(u); } for(int i = 0; i<n; ++i){ int x; cin >> x; --x; states[x].push_back(i); } dfs1(0, 0); for(int i = 0; i<k; ++i){ int top = states[i][0]; for(auto v : states[i]) top = lca(top, v); for(auto v : states[i]) ++dif[v], --dif[top]; } dfs2(0, 0); for(int i = 1; i<n; ++i) if(huh[i]==0 && cnt[i]==cnt[0]) ++ans; 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...