一二三四五 上山打老虎

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;
}
posted @ 2021-01-20 14:15  黒川川  阅读(111)  评论(0)    收藏  举报