Submission #391453

#TimeUsernameProblemLanguageResultExecution timeMemory
391453qwerasdfzxclMergers (JOI19_mergers)C++14
100 / 100
1539 ms164480 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; vector<int> adj[500500], joi[500500], v[500500]; int col[500500], cnt[500500], val=0, val2=0; bool visited[500500], visited2[500500], chk[500500]; struct LCA{ int spa[500500][21], dep[500500]; void dfs(int s, int pa=0){ spa[s][0]=pa; for (int i=1;i<21 && spa[s][i-1];i++) spa[s][i] = spa[spa[s][i-1]][i-1]; dep[s] = dep[pa]+1; for (auto &v:adj[s]) if (v!=pa){ dfs(v, s); } } int query(int v, int u){ if (dep[v]>dep[u]) swap(v, u); for (int i=20;i>=0;i--) if (spa[u][i] && dep[spa[u][i]]>dep[v]) u = spa[u][i]; if (dep[v]!=dep[u]) u = spa[u][0]; if (v!=u){ for (int i=20;i>=0;i--) if (spa[v][i] && spa[v][i]!=spa[u][i]) v = spa[v][i], u = spa[u][i]; v = spa[v][0], u = spa[u][0]; } return v; } }lca; pair<int, int> dfs1(int s){ pair<int, int> ret; ret.second = 1; for (auto &x:v[s]){ ret.first += cnt[x]; } visited[s]=1; //printf("%d %d %d\n", s, ret.first, ret.second); //printf(" %d %d %d\n", col[s], lct[col[s]], cnt[s]); for (auto &v:adj[s]) if (!visited[v]){ auto tmp = dfs1(v); ret.first += tmp.first; ret.second += tmp.second; } if (ret.first==ret.second) chk[s]=1; //printf("%d %d %d\n", s, ret.first, ret.second); return ret; } int dfs2(int s, bool test){ int ret=0; if (chk[s]) ret++; if (chk[s] && s!=1 && !test) test=1, val2++; visited2[s] = 1; for (auto &v:adj[s]) if (!visited2[v]){ ret += dfs2(v, test); } if (chk[s] && ret==1 && s!=1) val++; return ret; } int main(){ int n, k; scanf("%d %d", &n, &k); for (int i=0;i<n-1;i++){ int a, b; scanf("%d %d", &a, &b); adj[a].push_back(b); adj[b].push_back(a); } for (int i=1;i<=n;i++){ scanf("%d", col+i); cnt[col[i]]++; joi[col[i]].push_back(i); } lca.dfs(1); for (int i=1;i<=k;i++){ int tmp; tmp = joi[i][0]; if (cnt[i]==1){ v[tmp].push_back(i); continue; } for (int j=1;j<cnt[i];j++){ tmp = lca.query(tmp, joi[i][j]); } v[tmp].push_back(i); } dfs1(1); dfs2(1, 0); /*for (int i=1;i<=k;i++) printf("%d ", lct[i]); printf("\n"); for (int i=1;i<=n;i++) printf("%d ", chk[i]); printf("\n");*/ if (val2==1) val++; //printf("%d\n", val2); printf("%d\n", (val+1)/2); return 0; }

Compilation message (stderr)

mergers.cpp: In function 'int main()':
mergers.cpp:63:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   63 |     scanf("%d %d", &n, &k);
      |     ~~~~~^~~~~~~~~~~~~~~~~
mergers.cpp:66:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   66 |         scanf("%d %d", &a, &b);
      |         ~~~~~^~~~~~~~~~~~~~~~~
mergers.cpp:71:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   71 |         scanf("%d", col+i);
      |         ~~~~~^~~~~~~~~~~~~
#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...