Wannafly挑战赛4 B,小AA的数列

题意:求子区间异或和,要求区间长度在l到r之间,并且为偶数

题解:对于每一位算贡献,可以分奇偶来记录,计算的时候只加上奇偶性相同的就保证了为偶数,从大于l的点开始每次++,从大于r的点每次--,记录二进制上所有权值和 

#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 1000000007
#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 cnt[3][3];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,l,r;
    cin>>n>>l>>r;
    if(l&1)l++;
    if(r&1)r--;
    if(l>r)
    {
        cout<<0<<endl;
        return 0;
    }
    for(int i=1;i<=n;i++)cin>>a[i],a[i]^=a[i-1];
    ll sum=0;
    for(ll i=0;i<=31;i++)
    {
        memset(cnt,0,sizeof cnt);
        ll ans=0;
        for(ll j=1;j<=n;j++)
        {
            if(j>=l)cnt[j&1][(a[j-l]>>i)&1]++;
            ans=(ans+cnt[j&1][!((a[j]>>i)&1)])%mod;
          //  cout<<ans<<endl;
            if(j>=r)cnt[j&1][(a[j-r]>>i)&1]--;
        }
        sum=(sum+ans*(1ll<<i)%mod)%mod;
    }
    cout<<(sum+mod)%mod<<endl;
    return 0;
}
/********************
3 3 3
1 0 1
********************/
View Code
原文地址:https://www.cnblogs.com/acjiumeng/p/7896618.html