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; }