题意: 给你一个树,两个人做游戏,回合制。
每个回合,一个人能选择一个节点,将该节点的存值像该节点的父亲节点转移,该值>=1 .最终全部转移到0节点,如果没有可操作的价值,即无步可走,lose。
你先走,问你能否赢。
首先这肯定是个nim,暴力来一发吧, TE。。。
那再推推,,树的深度!!, 对啊,偶数深度,先手如果拿一个上去,后手可以模仿先手往上放,那就等于没放。还是原来的局面。
奇数深度则相反。
所以只用对深度为奇数的数nim就好,再来一发,TE。。。。
我是用并查集,每次一个一个找深度为多少,
最后,开了一个数组,dep记录深度,让该点的深度等于该点父节点深度+1,,,,AC
。
#include<bits/stdc++.h>
#define LL long long
using 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;
}