P8743 [蓝桥杯 2021 省 A] 异或数列 题解

题意补充:初始 a,b 均为 0

位越高对 a,b 的贡献越大,所以从高位往低位考虑。给几组样例以便分析:

1 0 0 0 0

1 1 0 0 0

1 1 1 0 0

1 1 1 0

答案分别是 1,0,1,1

设当前位有 x1,有 y2

  • 如果 x=1,Alice 必胜。
  • 如果 2|x,当前位无法判断。
  • 如果 x12|x+1,如果 2|y,Alice 必胜,否则 Bob 必胜。

对于第二种情况,无论如何选择,Alice 和 Bob 选择的 1 的个数的奇偶性相同;对于第三种情况,双方同时选 0 的情况不会影响答案,可以将 y 视为 y%2。选了奇数个 1 的人才能得到贡献,所以如果 y=0,Alice 必败,否则 ta 可以通过选 0 来夺回优势。

按照上述思路从高位往低位分析即可。

code:

#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e5+10;
int t,n,c[N],maxn;
int get(int x)
{
int cnt=0;
while(x)x/=2,cnt++;
return cnt;
}
int work()
{
for(int i=get(maxn);i>=0;i--)
{
int cnt=0;//文中 x
for(int j=1;j<=n;j++)cnt+=bool((c[j]>>i)%2);
if(cnt==1)return 1;
else if(cnt%2)return(n-cnt)%2?-1:1;
}
return 0;
}
signed main()
{
scanf("%d",&t);
while(t--)
{
maxn=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&c[i]),maxn=max(maxn,c[i]);
printf("%d\n",work());
}
}
posted @   jr_inf  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示