[ARC098B] Xor Sum 2

关于异或运算和代数和运算有很不错的性质:

\(xor_{i = 1} ^ {n}a_i \leq \sum_{i = 1} ^ n a_i\)

所以我们考虑一段区间按题目来说是合法的,即 \(xor_{i = 1} ^ {n}a_i = \sum_{i = 1} ^ n a_i\) 是满足一段不符合,则整段不符合的性质的。
那么可以用 \(two-point\)

[ARC098B] Xor Sum 2
#include<iostream>
#include<cstdio>
#define ll long long 
#define N 200005

ll n;
ll a[N];
ll sum[N],xsum[N];//sum >= xsum

int main(){
	scanf("%lld",&n);
	for(int i = 1;i <= n;++i){
		scanf("%lld",&a[i]);
		sum[i] = sum[i - 1] + a[i];
		xsum[i] = xsum[i - 1] ^ a[i];
	}
	ll l = 0;
	ll ans = 0;
	for(int r = 1;r <= n;++r){
		while(l < r && (sum[r] - sum[l] != (xsum[r] ^ xsum[l])))
		l ++ ;
		ans += r - l;
	}
	std::cout<<ans<<std::endl;
}

posted @ 2021-07-10 18:26  fhq_treap  阅读(42)  评论(0编辑  收藏  举报