hdu 5996 dingyeye loves stone

本文探讨了一种基于树形结构的游戏策略问题,通过分析树的深度和节点价值,提出了有效的解决方案。文章介绍了一个回合制游戏,玩家轮流操作,目标是在树结构中将节点的价值逐步转移至根节点。通过nim游戏理论,特别关注了奇数深度节点的价值,实现了高效的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


点击打开链接


题意: 给你一个树,两个人做游戏,回合制。

每个回合,一个人能选择一个节点,将该节点的存值像该节点的父亲节点转移,该值>=1 .最终全部转移到0节点,如果没有可操作的价值,即无步可走,lose。

你先走,问你能否赢。

首先这肯定是个nim,暴力来一发吧,  TE。。。

那再推推,,树的深度!!, 对啊,偶数深度,先手如果拿一个上去,后手可以模仿先手往上放,那就等于没放。还是原来的局面。

奇数深度则相反。

所以只用对深度为奇数的数nim就好,再来一发,TE。。。。

我是用并查集,每次一个一个找深度为多少,

最后,开了一个数组,dep记录深度,让该点的深度等于该点父节点深度+1,,,,AC


#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=100000+10;
int a[maxn],f[maxn],dep[maxn];
int main(){
    int T,n;
    scanf("%d",&T);
    while(T--){
        int ans=0;
        scanf("%d",&n);
        for(int i=1;i<n;i++){
            scanf("%d",&f[i]);
            dep[i]=dep[f[i]]+1;
        }
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<n;i++){
            if(dep[i]&1) ans^=a[i];
        }
        if(ans) printf("win\n");
        else printf("lose\n");
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值