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

http://acm.hdu.edu.cn/showproblem.php?pid=5996

题意:在一棵树上进行博弈,每次只能将当前的结点的石子放到父节点上,最后不能移动的输。

思路:比赛的时候想的是对于每一个深度为dep的结点,可以转化为dep堆同样的深度为1的结点,然后就不会了,忘了最后异或起来偶数可以抵消,相当于对方移动,我方也跟着移动对方上一个回合移动的石子,所以最后只要考虑深度为奇数的结点。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <string>
 6 #include <cmath>
 7 #include <queue>
 8 #include <vector>
 9 #include <map>
10 using namespace std;
11 #define INF 0x3f3f3f3f
12 #define N 100010
13 typedef long long LL;
14 
15 int fa[N], a[N], dep[N];
16 
17 int main()
18 {
19     int t;
20     scanf("%d", &t);
21     while(t--) {
22         int n;
23         scanf("%d", &n);
24         int ans = 0;
25         dep[0] = 0;
26         for(int i = 1; i < n; i++)
27             scanf("%d", &fa[i]);
28         for(int i = 0; i < n; i++)
29             scanf("%d", &a[i]);
30         for(int i = 1; i < n; i++)
31             dep[i] = dep[fa[i]] + 1;
32         for(int i = 0; i < n; i++)
33             if(dep[i] & 1) ans ^= a[i];
34         if(ans) puts("win");
35         else puts("lose");
36     }
37     return 0;
38 }
原文地址:https://www.cnblogs.com/fightfordream/p/6193440.html