题目
有 个数
,给出
个询问,每次询问给出区间
,现在请找到一个数
,使得
最大,
表示异或操作。
解题思路
要使条件 2 成立,需要求出区间 中,所有数值的二进制表示的 31 位,每位 1 的个数。
如果某位 0 的个数大于 1 的个数,那么所求 在该位上取 1,否则取 0。
计算区间 中每位 1 的个数,可以使用前缀和来实现。
区间 中所有数值的第
位中 1 的个数为
。
C++代码
#include<cstdio>
#include<vector>
using namespace std;
int main(){
int N, q;
scanf("%d", &N);
vector<vector<int>> bits(N+1, vector<int>(31,0));
int a;
for(int i=1; i<=N; ++i){
scanf("%d", &a);
int k = 0;
for(int k=0; k<31; ++k){
if((a&1))
bits[i][k] = bits[i-1][k] + 1;
else
bits[i][k] = bits[i-1][k];
a >>= 1;
}
}
scanf("%d", &q);
int L, R;
while(q--){
scanf("%d%d", &L, &R);
int X = 0;
int m = R-L+1;
for(int i=0; i<31; ++i){
int k = bits[R][i] - bits[L-1][i];
if(k < m-k){
X |= (1<<i);
}
}
printf("%d\n", X);
}
return 0;
} 
京公网安备 11010502036488号