Submission #379740

#TimeUsernameProblemLanguageResultExecution timeMemory
379740cgiosyMergers (JOI19_mergers)C++17
0 / 100
84 ms12900 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0);cin.tie(0); int N, M, ans=1; cin>>N>>M; vector<int> C(N), D(N), P(N, -1); vector<vector<int>> G(N), H(M); for(int i=1; i<N; i++) { int x, y; cin>>x>>y; --x, --y; G[x].push_back(y); G[y].push_back(x); } for(int i=0; i<N; i++) cin>>C[i], H[--C[i]].push_back(i); function<int(int)> root=[&](int i) { return P[i]>=0 ? P[i]=root(P[i]) : i; }; function<void(int, int)> dep=[&](int i, int p) { for(int j:G[i]) if(j!=p) D[j]=D[i]+1, dep(j, i); }; function<int(int, int)> dfs=[&](int i, int p) { int cnt=1; for(int j:G[i]) if(j!=p) { int v=dfs(j, i); cnt=~cnt && ~v ? cnt+v : -1; } p=i; for(int q:H[C[i]]) { p=root(p), q=root(q); if(p==q) continue; if(D[p]>D[q]) swap(p, q); P[p]+=P[q], P[q]=p; } H[C[i]].clear(); if(~cnt && i==p && -P[i]==cnt) ans++, cnt=-1; return cnt; }; dep(0, 0); dfs(0, 0); cout<<ans/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...