牛客OI赛制测试赛3 毒瘤xor(前缀和+贪心)

    科技2022-07-20  118

    题目链接:点此跳转

    题目描述: 解题思路:

    异或1取反,异或0不变,那么对于本题如果原来的数这一位是1,那我们肯定希望它异或一个0;如果原来是0,肯定希望异或1。 那么我们只需要求出[l,r]这个区间里面的数在每一位是1多还是0多,1多那么x的这一位就是0,0多x的这一位就是1,然后开一个前缀和数组统计一下每一位1的个数即可。

    Code:

    #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1e5+7; typedef long long ll; int val[maxn][31]; int n; int main() { scanf("%d",&n); ll num; for(int i=1;i<=n;i++){ scanf("%d",&num); for(int j=0;j<=30;j++){ val[i][j]=val[i-1][j]+((num>>j)&1); //第i个数的第j位1的数量 } } int q; scanf("%d",&q); while(q--){ int l,r; scanf("%d%d",&l,&r); if(l>r) swap(l,r); ll ans=0; int sum=r-l+1; for(int i=0;i<=30;i++){ int cnt=val[r][i]-val[l-1][i]; if(cnt*2<sum) ans|=(1ll<<i); // ans+=(1ll<<j); } printf("%lld\n",ans); } return 0; }
    Processed: 0.011, SQL: 8