Submission #164414

#TimeUsernameProblemLanguageResultExecution timeMemory
164414tneluccusMergers (JOI19_mergers)C++14
100 / 100
1880 ms136932 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+2;
const int LOG=20;
int color[N],tin[N],tout[N],now=0,level[N],ancestor[N][LOG],head[N],cnt[N],deg[N];
vector<int> adj[N],lis[N];
int findd(int x){
	if(head[x]<0){
		return x;
	}
	int y=findd(head[x]);
	head[x]=y;
	return y;
}
void unionn(int x,int y){
	x=findd(x),y=findd(y);
	head[x]+=head[y];
	head[y]=x;
}
bool samee(int x,int y){
	return findd(x)==findd(y);
}
void dfs(int x,int p){
	now++;
	tin[x]=now;
	for(int i=1;i<LOG;i++){
		ancestor[x][i]=ancestor[ancestor[x][i-1]][i-1];
	}
	for(int i:adj[x]){
		if(i!=p){
			level[i]=level[x]+1;
			ancestor[i][0]=x;
			dfs(i,x);
		}
	}
	tout[x]=now;
}
int fin(int x,int y){
	while(y){
		int k=__lg(y);
		x=ancestor[x][k];
		y-=(1<<k);
	}
	return x;
}
int LCA(int x,int y){
	if(level[x]>level[y]){
		x=fin(x,level[x]-level[y]);
	}
	y=fin(y,level[y]-level[x]);
	if(x==y){
		return x;
	}
	for(int i=LOG-1;i>-1;i--){
		if(ancestor[x][i]!=ancestor[y][i]){
			x=ancestor[x][i],y=ancestor[y][i];
		}
	}
	return ancestor[x][0];
}
bool cmp(int x,int y){
	return tin[x]<tin[y];
}
void dfs1(int x,int p){
	for(int i:adj[x]){
		if(i!=p){
			dfs1(i,x);
			cnt[x]+=cnt[i];
		}
	}
	if(cnt[x]&&x!=p){
		unionn(x,p);
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n,m,i,j,k,l,num,ans=0;
	cin>>n>>num;
	for(i=1;i<n;i++){
		cin>>j>>k;
		adj[j].push_back(k);
		adj[k].push_back(j);
	}
	for(i=1;i<=n;i++){
		head[i]=-1;
		cin>>color[i];
		lis[color[i]].push_back(i);
	}
	dfs(1,1);
	for(i=1;i<=num;i++){
		sort(lis[i].begin(),lis[i].end(),cmp);
		int sz=lis[i].size();
		for(j=1;j<sz;j++){
			k=LCA(lis[i][j-1],lis[i][j]);
			lis[i].push_back(k);
		}
		sort(lis[i].begin(),lis[i].end(),cmp);
		lis[i].erase(unique(lis[i].begin(),lis[i].end()),lis[i].end());
		for(j=1;j<lis[i].size();j++){
			k=LCA(lis[i][j-1],lis[i][j]);
			cnt[lis[i][j]]++;
			cnt[k]--;
		}
	}
	dfs1(1,1);
	for(i=1;i<=n;i++){
		for(j=0;j<adj[i].size();j++){
			if(findd(i)!=findd(adj[i][j])){
				deg[findd(i)]++;
				deg[findd(adj[i][j])]++;
			}
		}
	}
	for(i=1;i<=n;i++){
		if(findd(i)==i){
			if(deg[i]==2){
				ans++;
			}
		}
	}
	cout<<(ans+1)/2;
}

Compilation message (stderr)

mergers.cpp: In function 'int main()':
mergers.cpp:100:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(j=1;j<lis[i].size();j++){
           ~^~~~~~~~~~~~~~
mergers.cpp:108:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(j=0;j<adj[i].size();j++){
           ~^~~~~~~~~~~~~~
mergers.cpp:78:8: warning: unused variable 'm' [-Wunused-variable]
  int n,m,i,j,k,l,num,ans=0;
        ^
mergers.cpp:78:16: warning: unused variable 'l' [-Wunused-variable]
  int n,m,i,j,k,l,num,ans=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...
#Verdict Execution timeMemoryGrader output
Fetching results...