NC18979 毒瘤xor

简介: NC18979 毒瘤xor

题目: NC18979毒瘤xor ,哈哈,我们今天来看一道稍微复杂一点的题嘛,这是选自codeforce上的一道题,好了,我们一起来看看题意吧:

题目描述是复制的,可能有部分显示不对,我就把题目链接放下面!

题目链接: NC18979毒瘤xor

题目描述

输入描述

第一行一个整数N,表示序列的长度

第二行N个整数,表示序列内的元素

第三行一个整数q,表示询问的个数

接下来q行,每行两个整数[L, R],表示询问的区间

输出描述

输出q行,每行一个整数表示答案

若有多组可行解,请输出较小的解

示例1

输入

5

4 78 12 1 3

3

2 5

1 4

3 3

输出

2147483632

2147483635

2147483635

备注:

思路:

把这些区间的数看成二进制形式,看每一个位置中1或者0的个数 然后根据1多还是0多进行对比 来确定X当前位置应该为1还是0,若0多,则x这个位置应该为1,若1多,则x这个位置应该为0,若1和0一样多,则x这个位置可以为0,也可以为1,但是根据题意,要取小的,所以x这个位置就取0,具体的就看代码吧,有注释的!

我们来看看成功AC的代码吧:

#include<bits/stdc++.h>
using namespace std;
int n;
int sum[100010][32];
int a[100010],q;
int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int j=0;j<31;j++){
        for(int i=1;i<=n;i++){//前缀和来维护
            sum[i][j]=sum[i-1][j];
            if((a[i]>>j)&1) sum[i][j]++;
        }
    }
    cin>>q;
    while(q--){
        int l,r;    cin>>l>>r;
        int ans=0;
        for(int i=0;i<31;i++){
            if((sum[r][i]-sum[l-1][i])*2<r-l+1) ans|=(1<<i);//表示1少于0的个数,那么我们应该把这位设置为1
        }
        cout<<ans<<"\n";
    }
    return 0;
}


相关文章
|
1月前
|
人工智能 BI
MT3019 异或和的或
MT3019 异或和的或
|
1月前
NC251500 coin
NC251500 coin
22 1
|
1月前
NC253077:小沙的悬崖
NC253077:小沙的悬崖
21 0
|
9月前
[NC18386]字符串
[NC18386]字符串
|
9月前
NC21874 好串
NC21874 好串
|
9月前
NC14662 小咪买东西
NC14662 小咪买东西
|
9月前
NC50999 表达式计算4
NC50999 表达式计算4
|
9月前
NC14301 K-th Number
NC14301 K-th Number
|
人工智能 Windows
CF617E XOR and Favorite Number(异或前缀和+莫队)
CF617E XOR and Favorite Number(异或前缀和+莫队)
52 0