Submission #224462

#TimeUsernameProblemLanguageResultExecution timeMemory
224462super_j6Capital City (JOI20_capital_city)C++14
100 / 100
567 ms64504 KiB
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <stack> using namespace std; #define endl '\n' #define ll long long #define pi pair<int, int> #define f first #define s second const int maxn = 200000, k = 18; int n, m; int a[maxn], d[maxn], lc[maxn], id[maxn]; int p[k][maxn]; bool used[maxn]; vector<int> graph[maxn], scc[maxn]; vector<int> g[2][maxn]; stack<int> stk; int s; void dfs(int c){ for(int i : graph[c]){ if(i == p[0][c]) continue; d[i] = d[c] + 1; p[0][i] = c; dfs(i); } } void dfs2(int c, int t){ used[c] = !t; for(int i : g[t][c]){ if(used[i] ^ t) continue; dfs2(i, t); } if(t) scc[s].push_back(c), id[c] = s; else stk.push(c); } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; for(int i = 0; i < n - 1; i++){ int u, v; cin >> u >> v; u--, v--; graph[u].push_back(v); graph[v].push_back(u); } dfs(0); for(int i = 1; i < k; i++) for(int j = 0; j < n; j++){ p[i][j] = p[i - 1][j] == -1 ? -1 : p[i - 1][p[i - 1][j]]; } for(int i = 0; i < m; i++) lc[i] = -1; for(int i = 0; i < n; i++){ cin >> a[i]; a[i]--; if(lc[a[i]] == -1){ lc[a[i]] = i; }else{ int x = lc[a[i]], y = i; if(d[x] < d[y]) swap(x, y); for(int j = k - 1; j >= 0; j--) if(p[j][x] != -1 && d[p[j][x]] >= d[y]) x = p[j][x]; for(int j = k - 1; j >= 0; j--) if(p[j][x] != p[j][y]) x = p[j][x], y = p[j][y]; lc[a[i]] = x == y ? x : p[0][x]; } } for(int i = 0; i < n; i++){ if(i != lc[a[i]] && a[p[0][i]] != a[i]){ g[0][a[p[0][i]]].push_back(a[i]); g[1][a[i]].push_back(a[p[0][i]]); } } for(int i = 0; i < m; i++) for(int t = 0; t < 2; t++){ sort(g[t][i].begin(), g[t][i].end()); g[t][i].erase(unique(g[t][i].begin(), g[t][i].end()), g[t][i].end()); } for(int i = 0; i < m; i++) if(!used[i]) dfs2(i, 0); while(!stk.empty()){ int c = stk.top(); stk.pop(); if(used[c]) dfs2(c, 1), s++; } int ret = m; for(int i = 0; i < s; i++){ bool t = 1; for(int j : scc[i]) for(int l : g[1][j]){ t &= id[l] == i; } if(t) ret = min(ret, (int)scc[i].size() - 1); } cout << ret << endl; 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...