2020牛客寒假算法基础集训营4 F 树上博弈

https://ac.nowcoder.com/acm/contest/3005/F

当一个人无路可走的时候,就是它唯一的选择被对方占领

所以它在叶节点,对方在它的父节点,此时对方获胜

反之,它获胜

所以就是看谁能把谁逼到叶节点,且此时轮到对方行动,谁获胜

无论他们如何移动,他们各自移动一次之后,距离之差的奇偶性不会改变

因为假设一个人往远离对方的方向移动,距离改变奇偶性,对方无论往哪个方向移动,都会再改变一次奇偶性,相当于不改变

因为必败的局面是在叶节点,两人相邻,且轮到自己行动,距离差是1,为奇数

所以只要初始局面两人的距离差为偶数,则先手必胜

#include<cstdio>

using namespace std;

int cnt[2],dep[1000001];

int main()
{
    int n,x;
    scanf("%d",&n);
    dep[1]=cnt[1]=1;
    for(int i=2;i<=n;++i) 
    {
         scanf("%d",&x);
         cnt[dep[i]=dep[x]^1]++;
    }
    printf("%lld",1ll*cnt[0]*(cnt[0]-1)+1ll*cnt[1]*(cnt[1]-1));
    return 0;
}
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/12300664.html