• 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;
    }
  • 相关阅读:
    人事不干人事,这算什么事
    java 单例模式
    Java 中类的加载顺序
    新的挑战
    读《月亮和六便士》所思
    读《奇特的一生》后的一些感悟
    BTrace
    Java技能树
    Android Intent
    一个ListView优化的例子
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/12300664.html
Copyright © 2020-2023  润新知