Submission #1291060

#TimeUsernameProblemLanguageResultExecution timeMemory
1291060Jawad_Akbar_JJMergers (JOI19_mergers)C++20
100 / 100
816 ms106580 KiB
#include <iostream> #include <vector> using namespace std; const int N = (1<<19); vector<int> nei[N]; int Par[N][20], hei[N], c[N], ch[N], cnt[N], Mn[N], lca[N]; void dfs(int u, int p){ Par[u][0] = p; hei[u] = hei[p] + 1; for (int i=0;i<18;i++) Par[u][i+1] = Par[Par[u][i]][i]; for (int i : nei[u]){ if (i != p) dfs(i, u); } } void dfs2(int u, int p){ for (int i : nei[u]){ if (i == p) continue; dfs2(i, u); ch[u] += ch[i]; cnt[u] += cnt[i]; Mn[u] = min(Mn[u], Mn[i]); } if (Mn[u] == hei[u] and u - 1) ch[u] = 1; if (Mn[u] == hei[u] and cnt[u] == 0) cnt[u] = 1; } int LCA(int u, int v){ if (hei[u] > hei[v]) swap(u, v); for (int i=18;i>=0;i--){ if (hei[u] + (1<<i) <= hei[v]) v = Par[v][i]; } for (int i=18;i>=0;i--){ if (Par[u][i] != Par[v][i]) u = Par[u][i], v = Par[v][i]; } return (u == v ? u : Par[u][0]); } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m; cin>>n>>m; for (int i=1;i<n;i++){ int a, b; cin>>a>>b; nei[a].push_back(b); nei[b].push_back(a); } dfs(1, 0); for (int i=1;i<=n;i++){ cin>>c[i]; if (lca[c[i]] == 0) lca[c[i]] = i; else lca[c[i]] = LCA(lca[c[i]], i); } for (int i=1;i<=n;i++) Mn[i] = hei[lca[c[i]]]; dfs2(1, 0); if (ch[1] == 0) cout<<0<<'\n'; else if (ch[1] == 1) cout<<(cnt[1] + 2) / 2<<'\n'; else cout<<(cnt[1] + 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...