题意:给出n个结点的树 两个人轮流操作,操作为u-fa[u]传k个数 k小于等于a[u] 谁先不能操作则输.
观察发现 a[i]是在不断向root移动,当且仅当a[root]!=0 其他a[i]=0时 游戏结束
如果一个结点距离root为偶数,则对该结点操作无意义(若对手移动它们,则可模仿操作)
剩下的操作只有奇深度向偶深度移动这一步(移动这一步的数量a[i]等价于nim中的一堆石子)
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=1e5+20;
vector<int> e[N];
int n,fa[N],a[N],dis[N];//dis[i]结点i距离根结点距离
void dfs(int u,int d)
{
dis[u]=d;
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i];
dfs(v,d+1);
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n-1;i++)
{
scanf("%I64d",&fa[i]);
e[fa[i]].push_back(i);
}
dfs(0,0);
ll ans=0;
for(int i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
if(dis[i]%2)
{
ans^=a[i];
}
}
if(ans)
puts("win");
else
puts("lose");
for(int i=0;i<n;i++)
e[i].clear();
}
return 0;
}