Wannafly挑战赛4. B

本文详细解析了Wannafly挑战赛中编号为4.B的题目,该题要求计算子区间的异或和,同时限定区间长度在给定范围内并要求为偶数。通过分位计算和奇偶性匹配的方法,给出了一种有效的解决方案。

Wannafly挑战赛4. B

 

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

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

代码:

 1 #include<bits/stdc++.h>
 2 #define db double
 3 #define ll long long
 4 #define vec vector<ll>
 5 #define Mt  vector<vec>
 6 #define ci(x) scanf("%d",&x)
 7 #define cd(x) scanf("%lf",&x)
 8 #define cl(x) scanf("%lld",&x)
 9 #define pi(x) printf("%d\n",x)
10 #define pd(x) printf("%f\n",x)
11 #define pl(x) printf("%lld\n",x)
12 #define rep(i,x,y) for(int i=x;i<=y;i++)
13 #define debug puts("-------------");
14 const int N = 1e6 + 5;
15 const int mod = 1e9 + 7;
16 const int MOD = mod-1;
17 const db  eps = 1e-18;
18 const db  PI = acos(-1.0);
19 using namespace std;
20 ll a[N];
21 ll d[2][2];
22 int main()
23 {
24     int n,l,r;
25     ci(n),ci(l),ci(r);
26     for(int i=1;i<=n;i++)cin>>a[i],a[i]^=a[i-1];
27     ll ss=0;
28     if(l&1) l++;
29     if(r&1) r--;
30     if(l>r) return 0*puts("0");
31     for(int i=0;i<31;i++)
32     {
33         ll ans=0;
34         memset(d,0, sizeof(d));
35         for(int j=1;j<=n;j++)
36         {
37             if(j>=l) d[(j-l)&1][(a[j-l]>>i)&1]++,ans=(ans+d[j&1][!((a[j]>>i)&1)])%mod;
38             if(j>=r) d[(j-r)&1][(a[j-r]>>i)&1]--;
39         }
40         ss=(ss+ans*(1ll<<i)%mod)%mod;
41     }
42     pl((ss+mod)%mod);
43     return 0;
44 }

 

转载于:https://www.cnblogs.com/mj-liylho/p/7955664.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值