【每日一题】毒瘤xor

毒瘤xor

https://ac.nowcoder.com/acm/problem/18979

题目

个数 ,给出 个询问,每次询问给出区间 ,现在请找到一个数 ,使得

  1. 最大, 表示异或操作。

解题思路

要使条件 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;
}
全部评论

相关推荐

10-13 16:58
门头沟学院 Java
面了100年面试不知...:一周七天,一天去一家上班😍😍😍
点赞 评论 收藏
分享
10-15 20:01
已编辑
上海大学 Java
钉钉什么垃圾公司,约面鸽人
Syca_:途虎养车给我定了我这边早上六点的笔试,睡了四个小时起来难受的要命,告诉我面试时间是两天后的凌晨四点
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务