Scx117
只一眼,便辽阔了时间。

题意:给你一个数列,问有多少对(l,r)满足A[l]+A[l+1]+...+A[r]=A[l]^A[l+1]^...^A[r]?

 

标程:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=200005;
 5 int n,l;
 6 ll ans,sum,a[N];
 7 int main()
 8 {
 9     scanf("%d",&n);l=1;
10     for (int i=1;i<=n;i++) 
11     {
12         scanf("%lld",&a[i]);
13         while ((sum^a[i])!=sum+a[i]) sum^=a[l++];
14        ans+=i-l+1;sum^=a[i];
15     }
16     printf("%lld\n",ans);
17     return 0;
18 }

 

题解:性质

有(A+B)-(A^B)=2(A&B)。

由此我们推广一下,按位考虑异或性质,每一位最多只有一个1。或者说,进位加法和不进位加法相等的情况只有不进位的情况。

如果[l,r]区间的加法不进位,那么以r为右端点,左端点在[l,r]中的(l,r)都可行。

新加入一个右端点,那么有可能出现进位,往右移动左端点,使之不进位。由此可见,区间单调。

posted on 2018-05-30 19:49  Scx117  阅读(158)  评论(0编辑  收藏  举报