Submission #1219550

#TimeUsernameProblemLanguageResultExecution timeMemory
1219550siewjhCapital City (JOI20_capital_city)C++20
100 / 100
426 ms35372 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
const int inf = 1e9 + 7;
vector<int> adj[MAXN], tcl[MAXN];
int ca[MAXN], p[MAXN], sz[MAXN], lvl[MAXN];
bool ins[MAXN], vis[MAXN], city[MAXN];
int ans = inf;
int dfs(int x, int par){
	ins[x] = 1;
	int ssz = 1;
	for (int nn : adj[x]){
		if (nn == par || lvl[nn] != -1) continue;
		ssz += dfs(nn, x);
	}
	return sz[x] = ssz;
}
int dfs2(int x, int par, int ssz){
	for (int nn : adj[x]){
		if (nn == par || lvl[nn] != -1) continue;
		if (sz[nn] > ssz / 2) return dfs2(nn, x, ssz);
	}
	return x;
}
void dfs3(int x, int par){
	p[x] = par;
	for (int nn : adj[x]){
		if (nn == par || lvl[nn] != -1) continue;
		dfs3(nn, x);
	}
}
int calc(int cent){
	queue<int> q; vis[cent] = 1; q.push(cent);
	int res = 0;
	while (!q.empty()){
		int cn = q.front(), cc = ca[cn]; q.pop();
		if (!city[cc]){
			city[cc] = 1; res++;
			for (int nn : tcl[cc]){
				if (!ins[nn]) return inf;
				if (vis[nn]) continue;
				vis[nn] = 1; q.push(nn);
			}
		}
		int par = p[cn];
		if (par != -1 && !vis[par]){
			vis[par] = 1; q.push(par);
		}
	}
	return res;
}
void dfs4(int x, int par){
	ins[x] = 0; vis[x] = 0; city[ca[x]] = 0;
	for (int nn : adj[x]){
		if (nn == par || lvl[nn] != -1) continue;
		dfs4(nn, x);
	}
}
void decomp(int x, int clvl){
	int ssz = dfs(x, -1), cent = dfs2(x, -1, ssz);
	lvl[cent] = clvl;
	dfs3(cent, -1);
	ans = min(ans, calc(cent));
	dfs4(cent, -1);
	for (int nn : adj[cent]){
		if (lvl[nn] != -1) continue;
		decomp(nn, clvl + 1);
	}
}
int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int nums, cnum; cin >> nums >> cnum;
	for (int i = 1; i < nums; i++){
		int a, b; cin >> a >> b;
		adj[a].push_back(b); adj[b].push_back(a);
	}
	for (int i = 1; i <= nums; i++){
		int c; cin >> c;
		ca[i] = c; tcl[c].push_back(i);
	}
	memset(lvl, -1, sizeof(lvl));
	decomp(1, 0);
	cout << ans - 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...