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的主要内容,如果未能解决你的问题,请参考以下文章