Submission #1045589

#TimeUsernameProblemLanguageResultExecution timeMemory
1045589HunterXDMergers (JOI19_mergers)C++17
0 / 100
39 ms41952 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back typedef pair<int, int> pi; const char nd = '\n'; void solve(); signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; // cin >> t; while(t-->0) solve(); } // ------------------- Code Starts here ------------------- // Union Find struct UF{ vector<int> p, s; UF(int n): p(n), s(n, 1){ iota(p.begin(), p.end(), 0); } int find(int x){ return p[x] == x ? x : p[x] = find(p[x]); } void join(int x, int y){ x = find(x); y = find(y); if(x == y) return; if(s[x] < s[y]) swap(x, y); p[y] = x; s[x] += s[y]; } }; const int N = 5e5+7; vector<int> g[N], state[N]; int s[N], parent[N], level[N], jump[N]; UF group(N); // dfs to get parent and level of each node void dfs(int u, int p){ parent[u] = jump[u] = p; level[u] = level[p]+1; for (int v : g[u]){ if (v == p) continue; dfs(v, u); } } void solve(){ int n, k; cin >> n >> k; vector<pi> edges; for (int i = 1; i < n; i++){ int u, v; cin >> u >> v; edges.pb({u, v}); g[u].pb(v), g[v].pb(u); } for (int i = 1; i <= n; i++){ cin >> s[i]; state[s[i]].pb(i); } dfs(1, 0); for (int i = 1; i <= k; i++){ set<pi> st; for(int u: state[i]) st.insert({-level[u], u}); while(st.size() > 1){ auto [l, u] = *st.begin(); st.erase(st.begin()); int v = parent[u]; group.join(s[u], v); st.insert({-level[v], v}); } } // degree of each state group vector<int> deg(n+1, 0); for(auto [u, v]: edges){ u = group.find(s[u]), v = group.find(s[v]); if (u == v) continue; deg[u]++, deg[v]++; } int leaf = 0; for(int i = 1; i <= n; i++){ if(deg[i] == 1) leaf++; } cout << (leaf + 1) / 2 << nd; }
#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...