[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");
    }
}

原文地址:https://www.cnblogs.com/orzzz/p/8977911.html

时间: 2024-10-18 07:27:13

[bzoj359]Hungergame的相关文章

BZOJ3759: Hungergame 博弈论+线性基

学了新的忘了旧的,还活着干什么 题意:一些盒子,每步可选择打开盒子和取出已打开盒子的任意多石子,问先手是否必胜 搬运po姐的题解: 先手必胜的状态为:给出的数字集合存在一个异或和为零的非空子集,则先手必胜 证明: 首先我们有状态A:当前的所有打开的箱子中的石子数异或和为零,且所有关闭的箱子中的石子数的集合中不存在一个异或和为零的非空子集 易证A状态时先手必败 先手有两种操作: 1.从一个打开的箱子中拿走一些石子 那么根据Nim的结论 后手可以同样拿走一些石子使状态恢复为A状态 2.打开一些箱子

BZOJ 3759 Hungergame 博弈论+高斯消元

题目大意:给定一些箱子,每个箱子里有一些石子,两个人轮流操作,每个人可以进行以下操作之一: 1.打开任意多的箱子 2.从一个打开的箱子中拿走任意多的石子 不能操作者判负,求先手是否必胜 先手必胜的状态为:给出的数字集合存在一个异或和为零的非空子集,则先手必胜 证明: 首先我们有状态A:当前的所有打开的箱子中的石子数异或和为零,且所有关闭的箱子中的石子数的集合中不存在一个异或和为零的非空子集 易证A状态时先手必败 先手有两种操作: 1.从一个打开的箱子中拿走一些石子 那么根据Nim的结论 后手可以

BZOJ3759: Hungergame

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3759 题解:只想到了两种情况必胜,没有推广T_T 先说一下我想到了两种情况: 1)异或和为0  我们一次打开所有的就成了普通的nim游戏. 2)存在n-1的元素的自己异或和为0,那我们把这n-1个箱子打开,然后另一个人如果打开另一个,就成了nim,否则我们把这n-1堆取完,然后它打开我们取完.如果它中途打开了,我们下一步就把最后这堆取完,最终还是我们赢. 正解是必胜的充要条件是存在异或和为0

【BZOJ】【3759】Hungergame饥饿游戏

博弈论/高斯消元 如果没有打开箱子这个操作,那么就是一个很裸的Nim游戏…… 但是有了打开箱子这个操作,就变得蛋疼了T_T 首先我们可以想到一种直接的做法:打开所有箱子,当然如果此时所有a[i]的xor和==0则胜…… 但明显这样连样例也过不了╮(╯▽╰)╭ 那么我们可以想一下,对于一组全部没打开的箱子,我们进行一次操作后,会分成两组:打开的和没打开的(废话!) so sad……写不下去了…… 算了 Orz一下PoPoQQQ,搬运下题解: 先手必胜的状态为:给出的数字集合存在一个异或和为零的非空