[NIM博弈]矿物运输

题目限制
1500 ms 128 M

题目描述
在某个不知名的行星上蕴含着大量冰晶矿,Jim和他的好兄弟Swan自然不能放过这个赚钱的好机
会。Jim在整个星球上开掘树型矿洞,每个矿坑之间都有矿道相连。Jim和Swan在每个矿坑开采了
大量的矿石,现在他们面临一个新的问题,怎么把所有的矿石运出去。
已知,矿坑与矿坑之间形成了有向的树形结构,即除0号矿坑以外每个矿坑都有与其相连的父亲矿
坑。Jim总共开采了  n个矿坑并将其从0到 n-1  编号 ,每个矿坑都存有   val[i]个单位的矿石。
Jim和Swan每次操作都可以从某个矿坑移动至少1个单位的矿石到其父亲矿坑。Jim和Swan决定比
试一下,由Jim开始轮流操作,最后不能操作的人输。Jim偷偷的找到了你,他想知道在两人都采取
最优策略的情况下是否Jim能够赢得这场比试。
输入格式
多组数据
第一行为数据组数,T <=30
第二行一个整数n,表示矿坑数目,n<=2e5
接下来一行为n-1个整数fa[1]..fa[n-1],分别描述了除根节点外每个点的父亲。方便起见,保证

0<=fa[i]<i。
接下来一行为n个非负整数val[0]..val[n-1],分别描述了每个矿坑初始的矿石数。0<=val[i]<1e9。

输出格式
对于每组数据,输出一行,若Jim必胜则输出"win",否则输出"lose"(不含引号)。

数据范围
对于 25%的数据 保证 n<=10
对于 50%的数据 保证 n<=1000
存在 10%的数据 每个矿坑只有一个子矿坑
存在 10%的数据 除0号矿坑外,每个矿坑都与0号矿坑相连。
对于 100%的数据 保证 n<=200000

输入样例
1
6
0 0 2 2 4  
1 4 0 1 1 2
输出样例
win

NIM博弈讲解 https://www.luogu.org/problemnew/solution/P2197

https://www.iteye.com/blog/huobengle-1386808

多个有向图(G)游戏的
和SG函数值等于它包含的各个子游戏SG函数值的异或和,即SG(G) = SG(G1) xor SG(G2) xor …
SG(Gm)。

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=200005;
 5 int n,fa[N],val[N],sum;
 6 int num,last[N],nxt[N],ver[N];
 7 inline void add(int x,int y) {nxt[++num]=last[x]; last[x]=num; ver[num]=y;}
 8 void dfs(int x,int dep)
 9  {if(dep&1) sum^=val[x];
10   for(int i=last[x];i;i=nxt[i])
11    {int y=ver[i];
12     dfs(y,dep+1);
13    }
14  }
15 int main()
16  {
17  freopen("ore.in","r",stdin);
18  freopen("ore.out","w",stdout);
19  int t; scanf("%d",&t);
20
21  while(t--)
22   {scanf("%d",&n);
23    num=sum=0; memset(last,0,sizeof(last));
24
25    for(int i=2;i<=n;i++)
26     {scanf("%d",&fa[i]); fa[i]++; add(fa[i],i); }
27    for(int i=1;i<=n;i++) scanf("%d",&val[i]);
28    dfs(1,0);
29    if(sum) printf("win\n");
30    else    printf("lose\n");
31   }
32
33
34 return 0;
35  }

原文地址:https://www.cnblogs.com/YuXiaoze/p/11826032.html

时间: 2024-10-18 15:05:48

[NIM博弈]矿物运输的相关文章

ACM学习历程—HDU 3915 Game(Nim博弈 &amp;&amp; xor高斯消元)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3915 题目大意是给了n个堆,然后去掉一些堆,使得先手变成必败局势. 首先这是个Nim博弈,必败局势是所有xor和为0. 那么自然变成了n个数里面取出一些数,使得xor和为0,求取法数. 首先由xor高斯消元得到一组向量基,但是这些向量基是无法表示0的. 所以要表示0,必须有若干0来表示,所以n-row就是消元结束后0的个数,那么2^(n-row)就是能组成0的种数. 对n==row特判一下. 代码:

UVA 11859 Division Game (Nim博弈)

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32746 题意:有一个n*m(1<=n,m<=50)矩阵,每个元素均为2~10000之间的正整数,两个游戏者轮流操作.每次可以选一行中的1个或者大于1的整数,把他们中的每个数都变成它的某个真因子,比如12可以边长1,2,3,4或者6,不能操作的输. 分析:考虑每个数包含的素因子个数(比如12=2*2*3包含3个素因子),则让一个数"变成它的素因子"

hdu 5011 (nim博弈模版)

//nim博弈 //有n堆石头,两人轮流每次从一堆中拿至少1,之多全部的石头,没有石头可拿为lose //判断先手是win还是lose # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int main() { int n,i; __int64 a,sum; while(~scanf("%d",&n)) { sum=0; fo

HDU 1849 Rabbit and Grass(nim博弈)

题目地址:HDU 1849 初次接触nim博弈,感觉好神奇的说...居然可以跟异或运算扯上关系....给人类的智商跪了...作为地球人我感到很自豪.. 具体证明什么的看这篇博客被.传送门 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #inclu

HDU 1907 Nim博弈变形

1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形.设糖果数为1的叫孤独堆,糖果数大于1的叫充裕堆,设状态S0:a1^a2^..an!=0&&充裕堆=0,则先手必败(奇数个为1的堆,先手必败).S1:充裕堆=1,则先手必胜(若剩下的n-1个孤独堆个数为奇数个,那么将那个充裕堆全部拿掉,否则将那个充裕堆拿得只剩一个,这样的话先手必胜).T0:a1

UVA 1559 - Nim(博弈dp)

UVA 1559 - Nim 题目链接 题意:一开始有s个石子,2n个人轮流取石子,每个人有个最大能取数目,2n个人奇数一队,偶数一队,取到最后一个石子的队输,问谁赢 思路:记忆化搜索,每个人取的时候对应的后继状态如果有一个必败态,则该状态为必胜态,如果都是必胜态,则该状态为必败态 代码: #include <stdio.h> #include <string.h> int n, s, m[25], dp[25][10005]; int dfs(int now, int state

ZOJ 3529 A Game Between Alice and Bob (分解质因数+Nim博弈)

A Game Between Alice and Bob Time Limit: 5 Seconds      Memory Limit: 262144 KB Alice and Bob play the following game. A series of numbers is written on the blackboard. Alice and Bob take turns choosing one of the numbers, and replace it with one of

[Nim博弈]hdu 1850 Being a Good Boy in Spring Festival

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1850 Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4053    Accepted Submission(s): 2394 Problem Description

POJ 2234 Matches Game(Nim博弈裸题)

Description Here is a simple game. In this game, there are several piles of matches and two players. The two player play in turn. In each turn, one can choose a pile and take away arbitrary number of matches from the pile (Of course the number of mat