牛客每日一题 7月3日 毒瘤xor (前缀和+贪心)
程序员文章站
2024-02-21 18:46:34
...
毒瘤xor
题目
异或
异或(^)
运算规则:0 ^ 0 = 0 ,0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 1.
题解
本题如果原来的数这一位是1,它异或一个0;如果原来是0,异或1。我们用一个前缀数组记录每一位的1的数量,如果1更多,我们就让他异或一个0, 如果0更多, 就异或一个1。前缀和的处理是需要(n*30)。
代码
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const int MAXN = 1e5 + 10;
//int a[MAXN];
int p[MAXN][35];
int main() {
int N, M, a, b;
int num = 0;
scanf("%d", &N);
for(int i = 1; i <= N; i++) {
scanf("%d", &num);
for(int j = 0; j <= 30; j++) { //前缀和处理
p[i][j] = p[i-1][j];
if((num >> j) & 1)
p[i][j]++;
}
}
scanf("%d", &M);
for(int i = 1; i <= M; i++) {
int ans = 0;
scanf("%d%d", &a, &b);
for(int j = 0; j < 31; j++) {
if(p[b][j] - p[a-1][j] < (b-a+2)/2) //贪心,判断每一位是1多还是0多
ans += (1 << j);
}
printf("%d\n", ans);
}
return 0;
}
上一篇: (dp)数字三角形