Submission #1059182

#TimeUsernameProblemLanguageResultExecution timeMemory
1059182MilosMilutinovicUnique Cities (JOI19_ho_t5)C++14
4 / 100
2057 ms274432 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; vector<vector<int>> g(n); 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); } vector<int> c(n); for (int i = 0; i < n; i++) { cin >> c[i]; --c[i]; } auto Bfs = [&](int v) { vector<int> d(n, -1); vector<int> que(1, v); d[v] = 0; for (int b = 0; b < (int) que.size(); b++) { int i = que[b]; for (int j : g[i]) { if (d[j] == -1) { d[j] = d[i] + 1; que.push_back(j); } } } return d; }; int x, y; { vector<int> d = Bfs(0); x = 0; for (int i = 1; i < n; i++) { if (d[i] > d[x]) { x = i; } } } { vector<int> d = Bfs(x); y = 0; for (int i = 1; i < n; i++) { if (d[i] > d[y]) { y = i; } } } vector<vector<int>> d(2); d[0] = Bfs(x); d[1] = Bfs(y); vector<int> res(n); for (int foo = 0; foo < 2; foo++) { int root = (foo == 0 ? x : y); vector<int> mx(n); vector<int> pr(n); vector<int> dep(n); function<void(int, int)> Dfs = [&](int v, int pv) { pr[v] = pv; mx[v] = 1; for (int u : g[v]) { if (u == pv) { continue; } dep[u] = dep[v] + 1; Dfs(u, v); mx[v] = max(mx[v], mx[u] + 1); } }; Dfs(root, root); vector<int> f(n, 1); auto Add = [&](int v, int d, int p) { while (d--) { f[v] += p; v = pr[v]; } }; vector<set<int>> cols(n); function<void(int, int)> Solve = [&](int v, int pv) { if (d[foo][v] >= d[foo ^ 1][v]) { Add(v, mx[v], -1); vector<bool> was(m); res[v] = 0; for (int u = pr[v]; ; u = pr[u]) { if (f[u] == 1) { res[v] = (int) cols[u].size(); // res[v] += !was[c[u]]; // was[c[u]] = true; break; } if (u == root) { break; } } Add(v, mx[v], +1); } multiset<int> st; for (int u : g[v]) { if (u == pv) { continue; } st.insert(mx[u]); } for (int u : g[v]) { if (u == pv) { continue; } st.erase(st.find(mx[u])); if (!st.empty()) { Add(pr[v], *prev(st.end()), -1); } cols[v].clear(); for (int x = pr[v]; ; x = pr[x]) { if (f[x] == 1) { cols[v] = cols[x]; break; } if (x == root) { break; } } cols[v].insert(c[v]); Solve(u, v); if (!st.empty()) { Add(pr[v], *prev(st.end()), +1); } st.insert(mx[u]); } }; Solve(root, root); } for (int i = 0; i < n; i++) { cout << res[i] << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...