Link:
Solution:
其实就是暴力
观察需要满足的条件:
1、个数和为偶数
2、最大个数不大于其它所有个数的和
如果只有第一个条件记录前缀和的奇偶性即可,接下来考虑去除不符合第二个条件的区间
由于一个数最大有60个1且每个数至少有1个1,因此只要暴力查询区间长度小于60的区间即可
Code:
#include <bits/stdc++.h> using namespace std; #define X first #define Y second #define pb push_back typedef double db; typedef long long ll; typedef pair<int,int> P; const int MAXN=5e5+10; ll n,x,cnt[MAXN],pre[MAXN],odd,even,res; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld",&x); while(x) cnt[i]+=x&1,x>>=1; } for(int i=1;i<=n;i++) pre[i]=pre[i-1]+cnt[i]; for(int i=1;i<=n;i++) { if(pre[i]%2==0) res+=even+1,even++; else res+=odd,odd++; res-=(pre[i]%2==pre[i-1]%2); } for(int i=1;i<=n;i++) { ll sum=cnt[i],mx=cnt[i]; for(int j=i-1;j>=1&&j>=i-61;j--) { sum+=cnt[j];mx=max(cnt[j],mx); if(mx>sum-mx&&sum%2==0) res--; } } printf("%lld",res); return 0; }