这道题思路就是,预处理前i个数字,二进制位上的1的总数。
因为要求找到一个x对区间内的a[i]做异或操作,使得异或后的区间和最大,而异或运算是这样的0^1=1 0^0=0 1^1=0,我们要想使得区间和最大,显然要让每一个位上的1的数量最大化,所以当1的数量比0少时,就对该位异或1,把0,1数量交换。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int n,q;
int sum[N][40]; //前i个数,各个位上有几个1
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=0;i<31;i++){
for(int j=1;j<=n;j++){
sum[j][i]=sum[j-1][i];
if(((a[j]>>i)&1)==1){
sum[j][i]++;
}
}
}
cin>>q;
for(int i=1;i<=q;i++){
int ans=0;
int l,r;
cin>>l>>r;
for(int j=0;j<31;j++){
if(2*(sum[r][j]-sum[l-1][j])<(r-l+1)){
ans|=(1<<j);
}
}
cout<<ans<<endl;
}
return 0;
}