题目
http://codeforces.com/problemset/problem/931/D
题意
给你一棵树,有n个节点,每个节点有一个苹果,在苹果成熟后,苹果会落下来,如果有两个苹果落到了同一个节点,那么这两个苹果会消失,问最后会有多少个苹果落到根节点。
题解
统计每个苹果落下来需要多少步,然后排序。sum统计相同步骤的个数,然后ans += sum%2
AC代码
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
#define ll long long
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int a[100005];
int apple[100005];
int tong[100005];
int main()
{
mem(a,0);
mem(tong,0);
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
scanf("%d",&a[i]);
apple[i] = a[i];
}
sort(a+2,a+n+1);
while(a[2] != 0)
{
a[2] = apple[a[2]];
tong[2]++;
}
for(int i=3;i<=n;i++)
{
if(apple[i] == apple[i-1])
tong[i] = tong[i-1];
else
tong[i] = tong[apple[i]]+1;
}
sort(tong+2,tong+n+1);
int sum = 1,ans = 1;
for(int i=3;i<=n;i++)
{
if(tong[i] == tong[i-1])
{
sum++;
}
else
{
ans += sum%2;
sum = 1;
}
}
ans += sum%2;
printf("%d\n",ans);
return 0;
}