大致题意 : 给定一串长度为n的数组, 在给定x, y, 对于数组的每一个数, 可以用x进行两种操作,
操作一 : x = x + a[i],
操作二 : x = x xor a[i];
问对 x 和 x+3 哪一个数可以通过对数组操作得到y
分析 : 一开始想模拟, 写发现时间复杂度肯定会爆, 我们可以对数据进行分析, 给定y 求x, x+3, 数据肯定是合理的, 对于x, x + 3我们一定可以得到一个y, 那么x 与 x + 3最大的不同是什么, 没错就是奇偶性, 最后操作完, x 或 x+3 的奇偶性一定是和y相等, 再对操作进行分析可以发现, 无论是+ 还是 xor, 他对奇偶性的影响都是一样的(可以列一个真值表), 所以我们可以遍历数组, 对x进行某种相同的操作, 其奇偶性与答案一样, 这里选择xor, 是因为数据范围很大, 若用+会爆数据
AC代码如下:
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <queue>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
int n;
ll x,y;
int main()
{
int T;
scanf("%d", &T);
while(T -- )
{
scanf("%d%lld%lld", &n, &x, &y);
for(int i = 0; i<n; i++)
{
ll a;
scanf("%lld", &a);
x ^= a;
}
// cout<<x<<" "<<(x>>1)&1<<" "<<y<<" "<<(y>>1) & 1<<endl;
if(x%2){
if(y%2) cout<<"Alice"<<endl;
else cout<<"Bob"<<endl;
}else{
if(y%2) cout<<"Bob"<<endl;
else cout<<"Alice"<<endl;
}
}
}