51nod 1963 树上Nim
Posted judge
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1963 树上Nim相关的知识,希望对你有一定的参考价值。
这题还真就是树上玩 Nim...
相关知识点就是阶梯博弈,具体可以康这里 →_→ PS:手动搜索阶梯博弈
然后这题就转化为了多路径的阶梯博弈,这样的话咱定义根节点深度为 0,然后把所有奇数深度点的权值异或一下康康是不是 0 就好了
但这里要注意别加边 dfs ,直接利用题目性质(fa[i]<i) O(n) 读入的同时得到深度就好了,咱就是加边dfs T 了一发....
//by Judge
#include<cstdio>
#include<cstring>
#include<iostream>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define go(u) for(Rg int i=head[u],v=e[i].to;i;v=e[i=e[i].nxt].to)
#define ll long long
using namespace std;
const int M=3e5+3;
typedef int arr[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int read() int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
int n,ans; arr d;
int main()
int T=read();
while(T--) n=read(),ans=0; Rg int x;
fp(i,1,n-1) x=read(),d[i]=d[x]^1;
fp(i,0,n-1) x=read();
if(d[i]&1) ans^=x;
puts(ans?"win":"lose");
return 0;
以上是关于51nod 1963 树上Nim的主要内容,如果未能解决你的问题,请参考以下文章
51nod 1069 Nim游戏 + BZOJ 1022: [SHOI2008]小约翰的游戏John(Nim游戏和Anti-Nim游戏)