[BZOJ 3759]Hungergame

时间:2021-06-22 16:19:31

Nim游戏获胜的条件是所有石子的异或和为0

如果先手要获胜,那么一定是打开了一个异或和为0的极大子集

什么是极大子集呢?

就是无论后手打开任何子集的箱子,都不能再使此时打开的箱子异或和为0.

容易证明这样做是对的。

#include <bits/stdc++.h>
#define maxn 100
using namespace std; int a[maxn], n, base[maxn]; bool Gauss(){
memset(base, 0, sizeof base);
for(int i = 1; i <= n; i ++){
for(int j = 30; j >= 0; j --)
if(a[i] >> j & 1){
if(!base[j]){base[j] = a[i]; break;}
else a[i] ^= base[j];
}
if(!a[i])return 1;
}return 0;
} int main(){
int test;
//scanf("%d", &test);
test = 10;
while(test --){
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
if(!Gauss())puts("YES");
else puts("NO");
}
return 0;
}

[BZOJ 1299]巧克力棒

愣是没看出来是一道题。。