Submission #1275489

#TimeUsernameProblemLanguageResultExecution timeMemory
1275489MisterReaperUnique Cities (JOI19_ho_t5)C++20
100 / 100
410 ms33408 KiB
// File uniquecities.cpp created on 02.10.2025 at 15:34:56 #include <bits/stdc++.h> using i64 = long long; #ifdef DEBUG #include "/home/ahmetalp/Desktop/Workplace/debug.h" #else #define debug(...) void(23) #endif constexpr int max_N = int(2E5) + 5; int N, M; std::vector<int> adj[max_N]; int C[max_N]; int dep[max_N]; void dfs1(int v, int pr) { for (auto u : adj[v]) { if (u == pr) { continue; } dep[u] = dep[v] + 1; dfs1(u, v); } } int h[max_N]; void dfs2(int v, int pr) { h[v] = 0; for (auto u : adj[v]) { if (u == pr) { continue; } dep[u] = dep[v] + 1; dfs2(u, v); h[v] = std::max(h[v], h[u] + 1); } } int now = 0; int cnt[max_N]; std::vector<int> stk; void add(int v) { stk.emplace_back(v); if (cnt[C[v]]++ == 0) { now++; } } void del(int v) { if (cnt[C[v]]-- == 1) { now--; } } void roll(int x) { while (!stk.empty() && dep[stk.back()] > x) { del(stk.back()); stk.pop_back(); } } int ans[max_N]; void dfs3(int v, int pr) { int big = -1, mx1 = -1, mx2 = -1; for (auto u : adj[v]) { if (u == pr) { continue; } int x = h[u] + 1; if (x > mx1) { big = u; mx2 = mx1; mx1 = x; } else if (x > mx2) { mx2 = x; } } if (big == -1) { debug(v, stk); ans[v] = std::max(ans[v], now); roll(dep[v] - 1); return; } roll(dep[v] - mx2 - 1); add(v); dfs3(big, v); roll(dep[v] - mx1 - 1); roll(dep[v] - 1); debug(v, stk); ans[v] = std::max(ans[v], now); add(v); for (auto u : adj[v]) { if (u == pr || u == big) { continue; } dfs3(u, v); roll(dep[v] - 1); add(v); } roll(dep[v] - 1); } void solve(int v) { dep[v] = 0; dfs2(v, -1); dfs3(v, -1); debug(); } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cin >> N >> M; for (int i = 1; i < N; ++i) { int A, B; std::cin >> A >> B; --A, --B; adj[A].emplace_back(B); adj[B].emplace_back(A); } for (int i = 0; i < N; ++i) { std::cin >> C[i]; --C[i]; } dep[0] = 0; dfs1(0, -1); int d0 = std::max_element(dep, dep + N) - dep; dep[d0] = 0; dfs1(d0, -1); int d1 = std::max_element(dep, dep + N) - dep; solve(d0); solve(d1); for (int i = 0; i < N; ++i) { std::cout << ans[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...