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

 

 

 

 

 

 

 题意:树上玩游戏,跳方格?????????差不多就是给一个树,上面有节点,然后问有多少种情况牛牛是必赢的

题解:我们可以看下如果两人之间距离为奇数那么,一定输,因为奇数点可以把两人之间的距离缩减为1,而两人之间的距离为1,那么先手的牛牛先走(必须走),而牛妹走到牛牛的位置上,所以....铁定输

如果两人之间距离为偶数,那么牛牛先走,按照上面奇数的推论,此时变相等于牛妹为先手,而且先手必输,所以牛牛必赢

所以就是统计两人之间的偶数距离有多少种情况

然后根据树的性质:到节点到根结节的距离为奇数点的节点,那么这些节点到所有的奇数节点的距离都为偶数,同样所有的偶数节点到其他偶数节点的距离也为偶数

#include <bits/stdc++.h>
 
#define debug(x) cerr<<#x<<'='<<x<<endl
#define set0(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
template<typename T> void read(T &x){
    x = 0;char ch = getchar();ll f = 1;
    while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}
    while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {
    read(first);
    read(args...);
}
 
int n,q,x,y,depth[1000010];
ll cnt[2];
 
int main() {
    read(n);
    depth[1] = 0;
    cnt[0] = 1;
    for(int i=2;i<=n;i++){
        int cc;
        read(cc);
        depth[i] = depth[cc]^1;
        cnt[depth[i]]+=1;
    }
    cout<<cnt[0]*(cnt[0]-1)+cnt[1]*(cnt[1]-1)<<endl;
    return 0;
}

 

posted @ 2020-02-12 11:00  RE-TLE  阅读(203)  评论(0编辑  收藏  举报