This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |