hdu 5996 dingyeye loves stone

来源:互联网 发布:互联网网络销售o2o 编辑:程序博客网 时间:2024/05/16 06:09


点击打开链接


题意: 给你一个树,两个人做游戏,回合制。

每个回合,一个人能选择一个节点,将该节点的存值像该节点的父亲节点转移,该值>=1 .最终全部转移到0节点,如果没有可操作的价值,即无步可走,lose。

你先走,问你能否赢。

首先这肯定是个nim,暴力来一发吧,  TE。。。

那再推推,,树的深度!!, 对啊,偶数深度,先手如果拿一个上去,后手可以模仿先手往上放,那就等于没放。还是原来的局面。

奇数深度则相反。

所以只用对深度为奇数的数nim就好,再来一发,TE。。。。

我是用并查集,每次一个一个找深度为多少,

最后,开了一个数组,dep记录深度,让该点的深度等于该点父节点深度+1,,,,AC


#include<bits/stdc++.h>#define LL long longusing namespace std;const int maxn=100000+10;int a[maxn],f[maxn],dep[maxn];int main(){    int T,n;    scanf("%d",&T);    while(T--){        int ans=0;        scanf("%d",&n);        for(int i=1;i<n;i++){            scanf("%d",&f[i]);            dep[i]=dep[f[i]]+1;        }        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        for(int i=1;i<n;i++){            if(dep[i]&1) ans^=a[i];        }        if(ans) printf("win\n");        else printf("lose\n");    }    return 0;}



0 0