这是一道数学题,看懂题目给的式子很重要
以题目举例的式子为例:[(a1&a1)|(a1&a2)^(a2&a1)|(a2&a2)]
首先理解与运算和或运算
与运算可以理解为取交集,也就是两个数二进制每位共有的为1或者都没有为1,只有一方有就为0
或运算可以理解为取并集,与就是两个二进制每位只要有一个有1则为1,全部没有则为0
那么式子直接先化简a1&a1=a1和a2&a2=a2,因为与自己本身取交集还是自己的那块区域
再化简a1|(a1&a2)这意思不就是先取a1和a2的交集再和a1取并集就是了,很显然可以想a1和a2取交集的区域一定属于或等于a1或者a2的所在区域,那么再取并集不还是a1本身吗?
后面的a2|(a1&a2)同理等于a2
最终式子只剩a1^a2
得到结果就是a1^a2^...^an
(其实可以自己试一试答案,如果你试了题目给的解法一定会超时。然后再发现题目是O(n^2)所以我们一定要优化到O(n)那么就要想着对着式子化简,再然后带几个数字进去试一试最终应该也能解决!!!)
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;
cin>>n;
vector<int>a(n+1);
int res=0;
for(int i=1;i<=n;i++){
cin>>a[i];
res^=a[i];
}
cout<<res<<endl;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while (t--) {
solve();
}
return 0;
}

京公网安备 11010502036488号