[bzoj359]Hungergame

Posted orzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj359]Hungergame相关的知识,希望对你有一定的参考价值。

bz不支持提交了,我觉得我写的应该没啥问题。

题面https://www.lydsy.com/JudgeOnline/problem.php?id=3759

我们知道Nim游戏如果所有石子数异或和等于0,那么后手必胜。所以作为先手,策略是这样的:

如果存在异或和为0的子集,那么一定存在一个最大的异或和为0的子集,称它为A。它的补集B不存在异或和为0的子集。(因为我们可以把为0的所有小子集合并)于是我们把A的盖子都打开。

接下来如果后手跟我们取A里的石子,像普通的Nim一样,我们总是取和他异或得0的,这样最后取完A里的石子就又轮到后手行动了。如果除此之外没有未开盖的先手就赢了。如果还有,那后手只能被迫开盖。

而之后后手不论怎么打开盖子,由于保证异或和不会再为0了,先手总是把打开盖子的取成异或和为0的状态。又回到了上面的状态,所以上面是一个必胜态。

如果不存在呢?那自然是先手开完盖子之后,后手取成必胜态咯。

判断是否有异或和为0的子集,线性基就行了。数据范围小状压就行了。重点还是在博弈吧。

#include<cstdio>
#include<cstring>
int T,n,m;
int g[31];
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);m=0;
        memset(g,0,sizeof g);
        for(int i=1;i<=n;i++){
            int x;scanf("%d",&x);
            for(int j=30;~j;j--){
                if(!(x>>j))continue;
                if(!g[j]){
                    g[j]=x;m++;break;
                }
                x^=g[j];
            }
        }
        if(n==m)puts("No");
        else puts("Yes");
    }
}

 

以上是关于[bzoj359]Hungergame的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4103THUSC2015异或运算

Bzoj4004 [JLOI2015]装备购买

Bzoj2339--Hnoi2011卡农

距离北京奥运还有359天,发布WPF版本的北京2008标志(下)

距离北京奥运还有359天,发布WPF版本的北京2008标志(上)

"arch/arm/kernel/head.S"里面一点片段的理解