제출 #1143003

#제출 시각아이디문제언어결과실행 시간메모리
1143003PersiaCapital City (JOI20_capital_city)C++17
0 / 100
244 ms123556 KiB
#include <bits/stdc++.h> #define bit(i, x) (x >> i & 1) #define ll long long const int N = 5e5 + 5; const int mod = 998244353; using namespace std; int n, k; vector<int> G[N]; int c[N]; // additional vector<int> G2[4 * N]; int st[4 * N]; int c1; vector<int> b[N]; // straight line int root; int a[N], m; // scc int num[4 * N], low[4 * N], cnt; int col[4 * N], ct; int val[4 * N]; int deg[4 * N]; vector<int> stk; // result int res; void predfs(int u, int par) { a[++m] = c[u]; for(int v : G[u]) if(v != par) predfs(v, u); } void addedge(int x, int y) { G2[x].push_back(y); // cerr << x << " " << y << "\n"; } void build(int id, int l, int r) { st[id] = ++c1; if(l == r) { addedge(st[id], a[l]); return; } int mid = (l + r) / 2; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); addedge(st[id], st[id * 2]); addedge(st[id], st[id * 2 + 1]); } void addedge2(int id, int l, int r, int u, int v, int x) { if(l > v || r < u) return; if(l >= u && r <= v) { addedge(x, st[id]); return; } int mid = (l + r) / 2; addedge2(id * 2, l, mid, u, v, x); addedge2(id * 2 + 1, mid + 1, r, u, v, x); } void dfs(int u) { num[u] = low[u] = ++cnt; stk.push_back(u); for(int v : G2[u]) if(!col[v]) { if(num[v]) low[u] = min(low[u], num[v]); else { dfs(v); low[u] = min(low[u], low[v]); } } if(num[u] == low[u]) { ct++; while(1) { int top = stk.back(); stk.pop_back(); col[top] = ct; val[ct] += (top <= k); if(top == u) break; } } } signed main(int argc, char* argv[]) { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k; for(int i = 1; i < n; i++) { int x, y; cin >> x >> y; G[x].push_back(y); G[y].push_back(x); } for(int i = 1; i <= n; i++) cin >> c[i]; for(int i = 1; i <= n; i++) if(G[i].size() == 1) { root = i; break; } assert(root != 0); predfs(root, -1); c1 = k; build(1, 1, n); for(int i = 1; i <= n; i++) b[a[i]].push_back(i); for(int i = 1; i <= k; i++) if(!b[i].empty()) { addedge2(1, 1, n, b[i][0], b[i].back(), i); } for(int i = 1; i <= c1; i++) if(!num[i]) dfs(i); for(int i = 1; i <= c1; i++) { for(int j : G2[i]) if(col[i] != col[j]) { deg[col[i]] += (val[col[j]] > 0); } } res = n - 1; for(int i = 1; i <= ct; i++) if(val[i] > 0) { if(!deg[i]) res = min(res, val[i] - 1); } cout << res; // for(int i = 1; i <= k; i++) cout << col[i] << " "; // debug // for(int i = 1; i <= n; i++) cerr << a[i] << " "; return 0 ^ 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...