zoukankan      html  css  js  c++  java
  • U14739 X ask Y III 子区间异或和

    题意:就是求所有子区间的异或和的和

    题解:就是算每一位对结果的贡献(最近好像遇到很多次这种题目),先前缀异或,从左向右扫记录二进制前缀的1,0个数,xor[i]==xor[j]^1的时候就加上这一位的权值

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define mod 20090717
    #define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pii pair<int,int>
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=200000+10,maxn=200000+10,inf=0x3f3f3f3f;
    
    ll a[N];
    ll one[50],zero[50];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i],a[i]^=a[i-1];
        ll sum=0;
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<30;j++)
            {
                if(((a[i]>>j)&1))//1
                {
                    sum+=zero[j]*(1ll<<j);
                    one[j]++;
                }
                else
                {
                    sum+=one[j]*(1ll<<j);
                    zero[j]++;
                }
            }
        }
        cout<<sum<<endl;
        return 0;
    }
    /********************
    2
    1 2
    ********************/
    View Code
  • 相关阅读:
    对js数组的splice实现
    前端必读
    命令模式
    访问者模式
    观察者模式
    解释器模式
    装饰器模式
    组合模式
    抽象工厂模式
    搜索结果关键词高亮显示
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7896372.html
Copyright © 2011-2022 走看看