Submission #280089

#TimeUsernameProblemLanguageResultExecution timeMemory
2800893zpMergers (JOI19_mergers)C++14
100 / 100
1715 ms78092 KiB
#include<bits/stdc++.h> using namespace std; const int mN = 500009; vector<int> V[mN]; int L[mN],R[mN], A[mN], St[mN], En[mN], S[mN], Good[mN], Deg[mN], Sz[mN], Min[mN], Max[mN]; int c = 1; int good_cnt = 0; void dfs1(int x, int p){ L[x] = c; R[x] = c; A[c] = x; c++; for(int y : V[x]){ if(y == p) continue; dfs1(y, x); R[x] = R[y]; } } void dfs2(int x, int p){ if(Good[x]) Sz[x] = 1; for(int y : V[x]){ if(y == p) continue; dfs2(y, x); Sz[x] += Sz[y]; } if(x > 1 && (Good[x] || (Sz[x] > 0 && Sz[x] < good_cnt))){ Deg[x]++; Deg[p]++; } } void dfs3(int x, int p){ Min[x] = St[S[x]]; Max[x] = En[S[x]]; for(int y : V[x]){ if(y == p) continue; dfs3(y, x); Min[x] = min(Min[x], Min[y]); Max[x] = max(Max[x], Max[y]); } if(x > 1 && Min[x] == L[x] && Max[x] == R[x]){ Good[x] = 1; good_cnt++; } } main(){ int n, k; cin >> n >> k; for(int i = 1; i < n; i++){ int a, b; cin >> a >> b; V[a].push_back(b); V[b].push_back(a); } for(int i = 1; i <= n; i++) cin >> S[i]; dfs1(1, 0); for(int i = 1; i <= n; i++){ int x = A[i]; if(!St[S[x]]) St[S[x]] = i; En[S[x]] = i; } dfs3(1, 0); dfs2(1, 0); int leaf_cnt = 0; for(int i = 1; i <= n; i++) if(Deg[i] == 1) leaf_cnt++; cout << (leaf_cnt + 1) / 2 << endl; }

Compilation message (stderr)

mergers.cpp:47:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   47 | main(){
      |      ^
#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...