#NIM博弈#[nssl 1441] 礦物運輸

題目

在這裏插入圖片描述


解題思路

首先,這是NIM博弈。
我們可以手推初始情況,將所有情況異或起來(除了根節點),根據是否等於0判斷,有8080分。
實際我們只需要將層數爲奇數的異或起來就可以了。


代碼

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{int y,next;}a[400010];
int n,T,tot,head[200001],w[200001],ans; 
void add(int x,int y){a[++tot]=(node){y,head[x]};head[x]=tot;}
void dfs(int x,int fa,int dep){
	if (dep==1) ans^=w[x]; 
	for(int i=head[x];i;i=a[i].next){
		int y=a[i].y; 
		if (y==fa) continue; 
		dfs(y,x,(dep==1?0:1)); 
		
	}
}
int main(){
	scanf("%d",&T); 
	while(T--){
		scanf("%d",&n); 
		memset(head,0,sizeof(head)); 
		tot=ans=0; 
		for(int i=1,y;i<n;i++) scanf("%d",&y),add(i+1,y+1),add(y+1,i+1); 
		for(int i=1;i<=n;i++) scanf("%d",&w[i]); 
		dfs(1,0,0); 
		if (ans>0) printf("win\n"); else printf("lose\n"); 
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章