码迷,mamicode.com
首页 > 其他好文 > 详细

51nod 1963 树上Nim

时间:2019-10-03 16:07:41      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:std   lin   sdi   pac   logs   puts   相关   include   typedef   

这题还真就是树上玩 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

标签:std   lin   sdi   pac   logs   puts   相关   include   typedef   

原文地址:https://www.cnblogs.com/Judge/p/11619821.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!