NC18979-毒瘤xor
题目链接:https://ac.nowcoder.com/acm/problem/18979
题意:给定n个数,a1,a2 ... an ,寻找一个数X,满足
1.\(0\leq X \leq 2^{31}\)
2.\(\sum_{i=L}^{R}X\bigoplus a_i\) 所得值最大
思路:对32位进行贪心,前缀和维护区间内每一位的1的数目,如果1的数目大于区间长度一半则此位为0否则为1。
坑点:贪心的时候是判断区间内所有数字当前位1的数目和区间长度做判断,不是和n判断,容易手误
反思:手误的办法就是对照代码和思路进行比较,不行就重写
#include<iostream>
using namespace std;
int a[(int)1e5+5];
int m[(int)1e5+5][32];
int main (){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++){
for(int j=0;j<=31;j++){
if(a[i]&(1<<j))
m[i][j]=1;
m[i][j]+=m[i-1][j];
}
}
int q;
cin>>q;
int l,r;
for(int i=0;i<q;i++){
cin>>l>>r;
int ans=0;
for(int j=0;j<31;j++){
if(2*(m[r][j]-m[l-1][j])>=(r-l+1))
continue;
ans=ans+(1<<j);
}
cout<<ans<<endl;
}
return 0;
}

浙公网安备 33010602011771号