Submission #253231

#TimeUsernameProblemLanguageResultExecution timeMemory
253231egekabasCapital City (JOI20_capital_city)C++14
0 / 100
458 ms60792 KiB
#include <bits/stdc++.h> #define ff first #define ss second #define pb push_back #define mp make_pair using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<ll, ll> pll; typedef pair<ull, ull> pull; typedef pair<int, int> pii; typedef pair<ld, ld> pld; int n, k; vector<int> g[200009]; int col[200009]; int depth[200009]; int dad[200009][30]; void dfs1(int v, int prt){ for(int i = 1; i < 30; ++i) dad[v][i] = dad[dad[v][i-1]][i-1]; for(auto u : g[v]) if(u != prt){ depth[u] = depth[v]+1; dad[u][0] = v; dfs1(u, v); } } int lca(int x, int y){ if(depth[x] < depth[y]) swap(x, y); for(int i = 29; i >= 0; --i) if(depth[dad[x][i]] >= depth[y]) x = dad[x][i]; if(x == y) return x; for(int i = 29; i >= 0; --i) if(dad[x][i] != dad[y][i]){ x = dad[x][i]; y = dad[y][i]; } return dad[x][0]; } int root[200009]; vector<int> con[200009]; void dfs2(int v, int prt){ for(auto u : g[v]) if(u != prt){ dfs2(u, v); if(col[u] != col[v] && root[col[u]] != depth[u]){ root[col[u]] = min(root[col[u]], root[col[v]]); con[col[u]].pb(col[v]); } } } int vis[200009]; vector<int> order; void ssc1(int v){ vis[v] = 1; for(auto u : con[v]) if(vis[u] == 0) ssc1(u); order.pb(v); } int gather(int v){ int ret = 1; vis[v] = 1; for(auto u : con[v]) if(vis[u] == 0) ret += gather(u); return ret; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); cin >> n >> k; for(int i = 0; i < n-1; ++i){ int x, y; cin >> x >> y; g[x].pb(y); g[y].pb(x); } for(int i = 1; i <= n; ++i) cin >> col[i]; depth[1] = 1; dfs1(1, 0); for(int i = 1; i <= n; ++i){ if(root[col[i]] == 0) root[col[i]] = i; else root[col[i]] = lca(root[col[i]], i); } for(int i = 1; i <= k; ++i) root[i] = depth[root[i]]; dfs2(1, 0); for(int i = 1; i <= k; ++i){ sort(con[i].begin(), con[i].end()); con[i].resize(unique(con[i].begin(), con[i].end())-con[i].begin()); /*cout << i << '\n'; for(auto u : con[i]) cout << u << ' '; cout << "\n\n";*/ } for(int i = 1; i <= k; ++i) if(vis[i] == 0) ssc1(i); for(int i = 1; i <= k; ++i) vis[i] = 0; int ans = 1e9; for(auto u : order){ if(vis[u] == 0) ans = min(ans, gather(u)-1); } cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...