题目大意:给出两个整数n,m,并分别给出一个长度为n的整数数组a,和一个长度为m的整数数组b,现在可以选择任意的bj(1<=j<=m)对数组ai(1<=i<=n)的进行a[i]=a[i]|b[j]的操作(该操作可以为0次)。然后在求sum=a[1]^a[2]^a[3]^...^a[n],我们需要求得sum的最大最小值。
思路:
|运算中该位的1不能变为0,如果n为偶数,那么在最后进行^运算时,该位的数字会变为0,因此,当n为偶数时,对a进行0次操作能使取值最大,而对数组a的每一位都进行从b[1]到b[m]的|操作能使取值最小。
那么当n为奇数时,同理我们可以得到,对a进行0次操作能使取值最小,而对a的每一位都进行从b[1]到b[m]的|操作能使取值最大化。
代码:
#include<iostream>
using namespace std;
const int maxn = 2e5 + 10;
long long a[maxn], b[maxn];
int main()
{
int t;
cin >> t;
while (t--)
{
long long s = 0;
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <= m; i++)
{
cin >> b[i];
s |= b[i];
}
long long sum1 = 0, sum2 = 0;
for (int i = 1; i <= n; i++)
{
sum1 ^= a[i];
sum2 ^= a[i] | s;
}
if (n % 2)//当n为奇数的时候,原始值就是最小的,最大值是应用于b中所有元素获得的
{
cout << sum1 << ' ' << sum2 << endl;
}
else
{
cout << sum2 << ' ' << sum1 << endl;
}
}
}