題目
解題思路
首先,這是NIM博弈。
我們可以手推初始情況,將所有情況異或起來(除了根節點),根據是否等於0判斷,有分。
實際我們只需要將層數爲奇數的異或起來就可以了。
代碼
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{int y,next;}a[400010];
int n,T,tot,head[200001],w[200001],ans;
void add(int x,int y){a[++tot]=(node){y,head[x]};head[x]=tot;}
void dfs(int x,int fa,int dep){
if (dep==1) ans^=w[x];
for(int i=head[x];i;i=a[i].next){
int y=a[i].y;
if (y==fa) continue;
dfs(y,x,(dep==1?0:1));
}
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(head,0,sizeof(head));
tot=ans=0;
for(int i=1,y;i<n;i++) scanf("%d",&y),add(i+1,y+1),add(y+1,i+1);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
dfs(1,0,0);
if (ans>0) printf("win\n"); else printf("lose\n");
}
}