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 }