hdu 5996 dingyeye loves stone nim同阶博弈

点击打开链接

题意:给出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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值