제출 #1217857

#제출 시각아이디문제언어결과실행 시간메모리
1217857emptypringlescan수도 (JOI20_capital_city)C++17
100 / 100
584 ms37076 KiB
#include <bits/stdc++.h>
using namespace std;
int n,k;
vector<int> adj[200005];
int arr[200005],tot[200005];
int sz[200005],del[200005];
int dfssize(int x, int p){
	sz[x]=1;
	for(int i:adj[x]){
		if(i==p||del[i]) continue;
		sz[x]+=dfssize(i,x);
	}
	return sz[x];
}
int findcent(int x, int p, int tsz){
	for(int i:adj[x]){
		if(i==p||del[i]) continue;
		if(sz[i]*2>tsz) return findcent(i,x,tsz);
	}
	return x;
}
vector<int> grr[200005];
int par[200005],v[200005],vcol[200005];
int ans;
vector<int> undo;
void dfs(int x, int p){
	grr[arr[x]].push_back(x);
	undo.push_back(arr[x]);
	par[x]=p;
	v[x]=0;
	vcol[arr[x]]=0;
	for(int i:adj[x]){
		if(i==p||del[i]) continue;
		dfs(i,x);
	}
}
void build(int x){
	x=findcent(x,-1,dfssize(x,-1));
	dfs(x,-1);
	vector<int> q;
	q.push_back(x);
	bool can=true;
	int col=0;
	while(!q.empty()){
		int yay=q.back();
		q.pop_back();
		if(vcol[arr[yay]]) continue;
		vcol[arr[yay]]=1;
		col++;
		if((int)grr[arr[yay]].size()!=tot[arr[yay]]){
			can=false;
			break;
		}
		for(int i:grr[arr[yay]]){
			int cur=i;
			while(cur!=-1&&!v[cur]){
				q.push_back(cur);
				v[cur]=1;
				cur=par[cur];
			}
		}
	}
	if(can){
		ans=min(ans,col);
	}
	del[x]=1;
	for(int i:undo) grr[i].clear();
	undo.clear();
	for(int i:adj[x]){
		if(!del[i]) build(i);
	}
}
int32_t main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> k;
    for(int i=0; i<n-1; i++){
		int a,b;
		cin >> a >> b;
		adj[a].push_back(b);
		adj[b].push_back(a);
	}
	for(int i=1; i<=n; i++){
		cin >> arr[i];
		tot[arr[i]]++;
	}
	ans=n;
	build(1);
	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...