hdu 5996 dingyeye loves stone(博弈)

题目链接:hdu 5996 dingyeye loves stone

题意:

给你一棵树,树的每一个节点有a[i]个石子,每个人可以将这个节点的石子移向它的父亲,如果没有合法操作,那么就算输,现在给你当前的局面,问你能否赢

题解:

设根节点的深度为0,将所有深度为奇数的节点的石子数目xor起来,则先手必胜当且仅当这个xor和不为0。 证明同阶梯博弈。对于偶深度的点上的石子,若对手移动它们,则可模仿操作;对于奇深度上的石子,移动一次即进入偶深度的点。 时空复杂度O(n)。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4
 5 const int N=1e5+7;
 6 vector<int>G[N];
 7 int a[N],ans,t,n,x;
 8
 9 void dfs(int u=0,int fa=0,int cnt=1)
10 {
11     int en=G[u].size()-1;
12     F(i,0,en)if(G[u][i]!=fa)
13     {
14         if(cnt&1)ans^=a[G[u][i]];
15         dfs(G[u][i],u,cnt+1);
16     }
17 }
18
19 int main(){
20     scanf("%d",&t);
21     while(t--)
22     {
23         scanf("%d",&n);
24         F(i,0,n)G[i].clear();
25         F(i,1,n-1)
26         {
27             scanf("%d",&x);
28             G[x].push_back(i);
29             G[i].push_back(x);
30         }
31         F(i,1,n)scanf("%d",a+i-1);
32         ans=0,dfs();
33         if(ans==0)puts("lose");
34         else puts("win");
35     }
36     return 0;
37 }

时间: 2024-10-17 08:09:54

hdu 5996 dingyeye loves stone(博弈)的相关文章

HDU 5996 dingyeye loves stone [阶梯Nim]

dingyeye喜欢和你玩石子游戏. dingyeye有一棵nn个节点的有根树,节点编号为00到n−1n−1,根为00号节点.游戏开始时,第ii个节点上有a[i]a[i]个石子.两位玩家轮流操作,每次操作玩家可以选择一个节点,并将该节点上的一些石子(个数不能为00)移动到它的父亲节点上去.如果轮到某位玩家时,该玩家没有任何合法的操作可以执行,则判负. 你在游戏中执先手,你想知道当前局面你能否必胜. 裸题... #include <iostream> #include <cstdio>

HDU 5996 dingyeye loves stone ---BestCoder Round #90

题目链接 设根节点的深度为0,将所有深度为奇数的节点的石子数目xor起来,则先手必胜当且仅当这个xor和不为0. 证明同阶梯博弈.对于偶深度的点上的石子,若对手移动它们,则可模仿操作:对于奇深度上的石子,移动一次即进入偶深度的点. 时空复杂度O(n). 用vector存搜一下就行. #include <cstdio> #include <iostream> #include <vector> #include <cstring> using namespac

HDU5996:dingyeye loves stone

题目链接:dingyeye loves stone 题意:给出一棵树,树上的每个节点都有石子若干, 两人博弈,每次操作都可以把任意节点的任意石子数转移到它的父亲节点, 若无法操作则输,给出树上的节点及石子数,问先手是否能赢 分析:“阶梯博弈”,若深度为偶数的节点,对方移多少石子,我们就移多少.故偶数节点可忽略不计 接下来只要异或深度为奇数的节点石子数即可 感想:深度不会求,dfs不会写,我真菜 第一种方法. 记录每个节点的子节点,dfs遍历所有节点,若深度为奇则异或 1 #include<cst

HDU 5996:dingyeye loves stone(阶梯博弈)

http://acm.hdu.edu.cn/showproblem.php?pid=5996 题意:在一棵树上进行博弈,每次只能将当前的结点的石子放到父节点上,最后不能移动的输. 思路:比赛的时候想的是对于每一个深度为dep的结点,可以转化为dep堆同样的深度为1的结点,然后就不会了,忘了最后异或起来偶数可以抵消,相当于对方移动,我方也跟着移动对方上一个回合移动的石子,所以最后只要考虑深度为奇数的结点. 1 #include <cstdio> 2 #include <algorithm&

HDU 1564 Play a game (博弈&amp;&amp;找规律)

Play a game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1430    Accepted Submission(s): 1168 Problem Description New Year is Coming! ailyanlu is very happy today! and he is playing a chessbo

[ACM] hdu 4248 A Famous Stone Collector (DP+组合)

A Famous Stone Collector Problem Description Mr. B loves to play with colorful stones. There are n colors of stones in his collection. Two stones with the same color are indistinguishable. Mr. B would like to select some stones and arrange them in li

hdu 5229 ZCC loves strings

题意: CC有N个字符串,他正在和Miss G.用这N个字符串玩一个小游戏.ZCC会从这N个串中等概率随机选两个字符串(不可以是同一个).然后,ZCC和Miss G.轮流操作.Miss G.总是先操作的.在每轮中,操作者可以选择操作A或操作B. 操作A:在两个串中选择一个当前非空的串,然后在这个串的末尾删去一个字符. 操作B: 若当前两个串完全相同且非空,则可以使用这个操作.此时两个串都被清空. 不能操作的玩家输掉了这个游戏. ZCC想要知道他输掉游戏的概率是多少(也就是Miss G.获胜的概率

hdu 1525 Euclid&#39;s Game 博弈

Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2219    Accepted Submission(s): 1000 Problem Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan

HDU 4873 ZCC Loves Intersection(JAVA、大数、推公式)

在一个D维空间,只有整点,点的每个维度的值是0~n-1 .现每秒生成D条线段,第i条线段与第i维度的轴平行.问D条线段的相交期望. 生成线段[a1,a2]的方法(假设该线段为第i条,即与第i维度的轴平行)为,i!=j时,a1[j]=a2[j],且随机取区间[0,n-1]内的整数.然后a1[i],a2[i]在保证a1[i]<a2[i]的前提下同样随机. 由于D条线段各自跟自己维度的轴平行,我们可以转换成只求第i个维度与第j个维度的相交期望,然后乘以C(2,n)就好了 显然线段[a1,a2]和线段[