#include<iostream>
using namespace std;
const int Max=200001;
int tot,Next[Max],ver[Max],Head[Max],color[Max],cnt[Max],hson[Max],sz[Max],cnt1[Max],ans,cl,n;
void add(int x,int y){
ver[++tot]=y;
Next[tot]=Head[x];Head[x]=tot;
}
void dfs1(int x){
sz[x]++;
for(int i=Head[x];i;i=Next[i]){
int y=ver[i];
dfs1(y);
if(sz[y]>sz[hson[x]]){
hson[x]=y;
}
sz[x]+=sz[y];
}
}
void del(int x){
int y=color[x];
cnt1[cnt[y]]--;cnt[y]--;
if(!cnt[y]){
cl--;
}
cnt1[cnt[y]]++;
for(int i=Head[x];i;i=Next[i]){
del(ver[i]);
}
}
void add1(int x){
if(!cnt[color[x]]){
cl++;
}
cnt1[cnt[color[x]]]--;cnt[color[x]]++;cnt1[cnt[color[x]]]++;
for(int i=Head[x];i;i=Next[i]){
int y=ver[i];
if(y!=hson[x]){
add1(y);
}
}
}
void dfs2(int x,int opt){
for(int i=Head[x];i;i=Next[i]){
int y=ver[i];
if(y!=hson[x]){
dfs2(y,0);
}
}
if(hson[x]){
dfs2(hson[x],1);
}
add1(x);
if(cnt1[cnt[color[x]]]==cl){
ans++;
// cout<<x<<" "<<cl<<endl;
}
if(!opt){
del(x);
}
}
int main(){
cin>>n;
int x;
cin>>color[1]>>x;
for(int i=2;i<=n;i++){
cin>>color[i]>>x;
add(x,i);
}
dfs1(1);
dfs2(1,1);
cout<<ans;
}
我用启发式合并写的,但只得了30分。