Submission #1264620

#TimeUsernameProblemLanguageResultExecution timeMemory
1264620tvgkCapital City (JOI20_capital_city)C++20
0 / 100
32 ms12100 KiB
#include<bits/stdc++.h> using namespace std; #define task "a" #define ll long long #define ii pair<ll, ll> #define fi first #define se second const long mxN = 1e5 + 7; int n, in[mxN], h[mxN], par[mxN][30], root[mxN], mn[mxN], k, num, c[mxN], ans, lst[mxN]; vector<int> w[mxN], ww[mxN]; void TiTo(int j) { in[j] = ++num; h[j] = h[par[j][0]] + 1; for (int i = 1; i <= 20; i++) par[j][i] = par[par[j][i - 1]][i - 1]; for (int i : w[j]) { if (in[i]) continue; par[i][0] = j; TiTo(i); } } bool cmp(int u, int v) { return in[u] < in[v]; } int LCA(int u, int v) { if (h[u] < h[v]) swap(u, v); for (int i = 20; i >= 0; i--) { if (h[par[u][i]] >= h[v]) u = par[u][i]; } if (u == v) return h[u]; for (int i = 20; i >= 0; i--) { if (par[u][i] != par[v][i]) { u = par[u][i]; v = par[v][i]; } } return h[u] - 1; } void DFS(int j) { root[j] = h[mn[c[j]]]; for (int i : w[j]) { if (h[i] < h[j]) continue; DFS(i); root[j] = min(root[j], root[i]); if (root[i] < h[i]) ww[c[i]].push_back(c[j]); } } int cs[mxN], low[mxN], dsu[mxN], vis[mxN], block; vector<int> vc; void Tarzan(int j) { if (j > n) return; cs[j] = low[j] = ++num; vis[j] = 1; vc.push_back(j); for (int i : ww[j]) { if (!vis[i]) Tarzan(i); if (vis[i] == 1) low[j] = min(low[i], low[j]); } if (low[j] != cs[j]) return; bool tt = 0; int cntt = 0; block++; while (vis[j] == 1) { int i = vc.back(); vc.pop_back(); vis[i] = 2; dsu[i] = block; cntt++; for (int u : ww[i]) tt |= (dsu[u] && dsu[u] != block); } if (!tt) ans = min(ans, cntt - 1); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen(task".INP", "r", stdin); //freopen(task".OUT", "w", stdout); cin >> n >> k; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; w[u].push_back(v); w[v].push_back(u); } TiTo(1); for (int i = 1; i <= n; i++) { cin >> c[i]; if (mn[c[i]]) mn[c[i]] = LCA(mn[c[i]], i); else mn[c[i]] = i; } DFS(1); ans = n; for (int i = 1; i <= k; i++) { if (!vis[i]) Tarzan(i); } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...