제출 #1264638

#제출 시각아이디문제언어결과실행 시간메모리
1264638tvgk수도 (JOI20_capital_city)C++20
0 / 100
254 ms59972 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 = 2e5 + 7; int n, in[mxN], h[mxN], par[mxN][30], mn[mxN], k, num, c[mxN], ans, lst[mxN], root[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] = j; while (h[root[j]] > h[mn[c[j]]]) { root[j] = par[root[j]][0]; ww[c[j]].push_back(c[root[j]]); root[j] = root[root[j]]; } for (int i : w[j]) { if (h[i] < h[j]) continue; DFS(i); } } int cs[mxN], low[mxN], vis[mxN], block, ltm[mxN]; vector<int> vc; void Tarzan(int j) { 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; ltm[i] = block; cntt++; for (int u : ww[i]) tt |= (ltm[u] && ltm[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...