解题思路:
注意事项:
参考代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 200010
#define maxc 200010
int n;
int son[maxn],color[maxn],sz[maxn];//son[i]表示i的重儿子
int cnt[maxc];//cnt[i]表示颜色i出现的次数
vector<int> tu[maxn];
int mx,tot;//mx是子树中颜色的最多的出现次数,tot是有多少种颜色达到了这个次数
int ans;
void dfs_son(int u){
sz[u]=1;
for(int v:tu[u]){
dfs_son(v);
if(sz[son[u]]<sz[v])son[u]=v;
sz[u]+=sz[v];
}
}
void update(int u,int pson){
int c=color[u];
cnt[c]++;
if(mx<cnt[c])mx=cnt[c],tot=1;
else if(mx==cnt[c])tot++;
for(int v:tu[u]){
if(v==pson)continue;
update(v,-1);
}
}
void del(int u){
cnt[color[u]]--;
for(int v:tu[u])del(v);
}
void dfs(int u,int op){
for(int v:tu[u]){
if(v==son[u])continue;
dfs(v,0);
}
if(son[u])dfs(son[u],1);
update(u,son[u]);
if(mx*tot==sz[u])ans++;
if(!op){
del(u);
mx=0;tot=0;
}
}
int main(){
scanf("%d",&n);
int u,c;
for(int i=1;i<=n;i++){
scanf("%d%d",&c,&u);
tu[u].push_back(i);
color[i]=c;
}
dfs_son(1);
dfs(1,1);
printf("%d",ans);
return 0;
}
0.0分
7 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复