阶梯博弈,即奇数堆的Nim游戏。
#include<bits/stdc++.h> using namespace std; const int MAXN = 1e5+5; vector<int> G[MAXN]; int a[MAXN]; int sum = 0; void dfs(int fa, int u, int cnt) { if(cnt%2) sum ^= a[u]; for(auto v:G[u]) { if(fa != v) { dfs(u, v, cnt+1); } } } int main() { int T; cin >> T; while(T--) { sum = 0; int n; scanf("%d", &n); for(int i = 0; i < n; i++) G[i].clear(); for(int i = 1; i < n; i++) { int t; scanf("%d", &t); G[i].push_back(t); G[t].push_back(i); } for(int i = 0; i < n; i++) scanf("%d", &a[i]); dfs(-1, 0, 0); if(sum) puts("win"); else puts("lose"); } return 0; }