Submission #1315862

#TimeUsernameProblemLanguageResultExecution timeMemory
1315862aaaaaaaaCapital City (JOI20_capital_city)C++20
11 / 100
3097 ms46552 KiB
#include <bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() const int mxN = 2e5 + 100; const int mxB = 21; vector<int> adj[mxN], c[mxN]; int st[mxN], sum[mxN], depth[mxN], dp[mxN][mxB], parent[mxN], seen[mxN], id[mxN], sz[mxN], dsu_par[mxN], total = 0, tin = 0; void dfs(int u, int par){ parent[u] = dp[u][0] = par, st[u] = ++tin, depth[u] = depth[par] + 1; for(int i = 1; i < mxB; ++i) dp[u][i] = dp[dp[u][i - 1]][i - 1]; for(auto it : adj[u]){ if(it ^ par) dfs(it, u); } } int find(int u){ return (u == dsu_par[u] ? u : dsu_par[u] = find(dsu_par[u])); } void unite(int u, int v){ u = find(u), v = find(v); if(u == v) return; sz[v] += sz[u]; dsu_par[u] = v; } int process(int root){ if(seen[root] || root <= 0) return -1; seen[root] = 1; int ans = 0; sort(all(c[root]), [&](int x, int y){ return st[x] < st[y]; }); c[root].push_back(c[root][0]); for(int i = 0; i < (int) c[root].size() - 1; ++i){ int u = c[root][i], v = c[root][i + 1]; while(1){ if(!seen[id[u]]) ans += process(id[u]) + 1; if(!seen[id[v]]) ans += process(id[v]) + 1; if(u == v) break; if(depth[u] > depth[v]) u = parent[u]; else v = parent[v]; if(u == -1 || v == -1) break; } } return ans; } signed main(){ ios::sync_with_stdio(0); cin.tie(nullptr); cout.tie(nullptr); int n, k, ans = 1e9; cin >> n >> k; for(int i = 0, u, v; i < n - 1; ++i){ cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } for(int i = 1, x; i <= n; ++i) { cin >> x; c[x].push_back(i); id[i] = x; } for(int i = 1; i <= k; ++i) dsu_par[i] = i, sz[i] = 1; dfs(1, -1); for(int i = 1; i <= k; ++i){ ans = min(ans, process(i)); for(int j = 1; j <= k; ++j) seen[j] = 0; } cout << ans << "\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...