NC18979 毒瘤xor

Posted cq.tiancx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;


谢谢你的阅读,由于作者水平有限,难免有不足之处,若读者发现问题,还请批评,在留言区留言或者私信告知,我一定会尽快修改的。若各位大佬有什么好的解法,或者有意义的解法都可以在评论区展示额,万分谢谢。
写作不易,望各位老板点点赞,加个关注!

以上是关于NC18979 毒瘤xor的主要内容,如果未能解决你的问题,请参考以下文章

UOJ#67 新年的毒瘤 tarjan

hbx的毒瘤贪心系列题解

Bzoj_5287 [Hnoi2018]毒瘤

P1081 开车旅行[倍增](毒瘤题)

plw的晚餐(毒瘤题害我暴0)

Change FZU - 2277 毒瘤啊 毒瘤题目