您的位置:首页 > 其它

hdu 5996 dingyeye loves stone

2016-12-18 14:36 330 查看
点击打开链接

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

每个回合,一个人能选择一个节点,将该节点的存值像该节点的父亲节点转移,该值>=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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: