题意:
一棵苹果树,有n个花蕊。花蕊成树状分布。一天果子全部成熟了,于是开始下落,每秒下落一个节点。神奇之处在于同一个节点同一时刻的果子会两两相消,即只能存k%2个果子。求可以落到地面多少果子。输入每个花蕊的前驱。
思路:
因为落的时候是一层一层的落,并且根节点只有一个1,我们就可以直接dfs求出每一层有多少果子。输出每层果子数%2之和即可。
代码:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<algorithm>
#include<vector>
using namespace std;
#define inf 1<<29
vector<int> G[100005];
int n,dis[100005];
void dfs(int u,int step)
{
for(int i=0;i<G[u].size();i++)
{
dis[step]++;
dfs(G[u][i],step+1);
}
}
int main()
{
scanf("%d",&n);
int d;
for(int i=1;i<=n;i++)
G[i].clear();
memset(dis,0,sizeof dis);
for(int i=2;i<=n;i++)
{
scanf("%d",&d);
G[d].push_back(i);
}
dfs(1,1);
int ans=1;
for(int i=1;i<=n;i++)
ans+=dis[i]%2;
printf("%d\n",ans);
return 0;
}