Vasya has a sequence $$$a$$$ consisting of $$$n$$$ integers $$$a_1, a_2, \dots, a_n$$$. Vasya may pefrom the following operation: choose some number from the sequence and swap any pair of bits in its binary representation. For example, Vasya can transform number $$$6$$$ $$$(\dots 00000000110_2)$$$ into $$$3$$$ $$$(\dots 00000000011_2)$$$, $$$12$$$ $$$(\dots 000000001100_2)$$$, $$$1026$$$ $$$(\dots 10000000010_2)$$$ and many others. Vasya can use this operation any (possibly zero) number of times on any number from the sequence.
Vasya names a sequence as good one, if, using operation mentioned above, he can obtain the sequence with bitwise exclusive or of all elements equal to $$$0$$$.
For the given sequence $$$a_1, a_2, \ldots, a_n$$$ Vasya‘d like to calculate number of integer pairs $$$(l, r)$$$ such that $$$1 \le l \le r \le n$$$ and sequence $$$a_l, a_{l + 1}, \dots, a_r$$$ is good.
The first line contains a single integer $$$n$$$ ($$$1 \le n \le 3 \cdot 10^5$$$) — length of the sequence.
The second line contains $$$n$$$ integers $$$a_1, a_2, \dots, a_n$$$ ($$$1 \le a_i \le 10^{18}$$$) — the sequence $$$a$$$.
Print one integer — the number of pairs $$$(l, r)$$$ such that $$$1 \le l \le r \le n$$$ and the sequence $$$a_l, a_{l + 1}, \dots, a_r$$$ is good.
3
6 7 14
2
4
1 2 1 16
4
In the first example pairs $$$(2, 3)$$$ and $$$(1, 3)$$$ are valid. Pair $$$(2, 3)$$$ is valid since $$$a_2 = 7 \rightarrow 11$$$, $$$a_3 = 14 \rightarrow 11$$$ and $$$11 \oplus 11 = 0$$$, where $$$\oplus$$$ — bitwise exclusive or. Pair $$$(1, 3)$$$ is valid since $$$a_1 = 6 \rightarrow 3$$$, $$$a_2 = 7 \rightarrow 13$$$, $$$a_3 = 14 \rightarrow 14$$$ and $$$3 \oplus 13 \oplus 14 = 0$$$.
In the second example pairs $$$(1, 2)$$$, $$$(2, 3)$$$, $$$(3, 4)$$$ and $$$(1, 4)$$$ are valid.
#include<stdio.h> typedef long long LL; int cnt(LL x) { int res = 0; while (x)res += x & 1, x >>=1; return res; } int b[300005]={0},fre[300005]; LL ai; int cnt0 = 0, cnt1 = 0; int main(){ int n; scanf("%d", &n); for(int i=1;i<=n;++i) { scanf("%I64d", &ai); b[i] = cnt(ai); fre[i] = fre[i - 1] + b[i]; if (fre[i] & 1)cnt1++; else cnt0++; } /*求和为偶数的区间个数: * *对于前缀和为奇数的[0,l1], [0,l2], ..., [0,lcnt1] * 对l1而言,它和后面的组合起来,[l1+1,l2], [l1+1,l3], ..., [l1+1,lcnt1]的和一定全都是偶数 * l2~lcnt1也同理,共cnt1-1+cnt1-2+...1=cnt1(cnt1-1)/2个 * * 对于和为偶数的区间[0,r1], [0, r2], ..., [0,rcnt0] * * 不仅和奇数的相同,每个区间本身也要加入计数 * 所以共cnt0+cnt0-1+...+1=(cnt0+1)cnt0/2个 */ LL ans = 1LL * cnt1*(cnt1 - 1) / 2+1LL*cnt0*(cnt0+1)/2; //遍历所有以i为起点的区间 for(int i=1;i<=n;++i) { int maxn = 0,sum; //只检查到长度为64 for(int j=0;j<=64&&i+j<=n;++j){ if (maxn < b[i + j])maxn = b[i + j]; sum = fre[i + j] - fre[i - 1]; if ((sum & 1) == 0 && (maxn<<1) > sum)ans--; } } printf("%I64d", ans); }
codeforces 1041 E.Vasya and Good Sequences(暴力?)
原文:https://www.cnblogs.com/tobyw/p/9714952.html