Miraclys

一言(ヒトコト)

AT4142 [ARC098B] Xor Sum 2

\(\large{题目链接}\)
\(\\\)
\(\Large\textbf{Solution: } \large{首先,异或有一个性质:\text{x} - \text{y} \leq \text{x} \oplus \text{y} \leq \text{x} + \text{y}。\\观察题目,容易发现,若一个区间符合要求,那么\text{a}_l到\text{a}_y的二进制每一位上最多只有一个1。\\然后设f[l]为l所能拓展到的最右点,那么显然l + 1也符合条件,因为l+1中1的个数只可以比l少,所以l满足单增,可以用尺取法来维护。}\)

\(\Large\textbf{Code: }\)

#include <bits/stdc++.h>
#define gc() getchar() 
#define LL long long
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define _rep(i, a, b) for (int i = (a); i >= (b); --i)
using namespace std;
const int N = 2e5 + 5;
int n, a[N];

inline int read() {
	int x = 0;
	char ch = gc();
	while (!isdigit(ch)) ch = gc();
	while (isdigit(ch)) x = x * 10 + ch - '0', ch = gc();
	return x; 
}

int main() {
	ios::sync_with_stdio(false);
	n = read();
	rep(i, 1, n) a[i] = read();
	LL ans = 0;
	for (int i = 1, l = 1, r = 1, cur = 0; i <= n; ++i) {
		for (; !(cur & a[r]) && r <= n;) cur |= a[r++], ans += r - l;
		cur ^= a[l++];
	}
	cout << ans << endl;
	return 0;
}
posted @ 2020-03-27 18:20  Miraclys  阅读(78)  评论(0编辑  收藏  举报

关于本博客样式

部分创意和图片借鉴了

BNDong

的博客,在此感谢