[Codeforces 1053B] Vasya and Good Sequences

Link:

Codeforces 1053B 传送门

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;
}
原文地址:https://www.cnblogs.com/newera/p/9705422.html