BZOJ 4245 OR-XOR

Posted on 2016-09-16 20:51  ziliuziliu  阅读(98)  评论(0编辑  收藏  举报

按位贪心。

前缀异或和没话说。一位为0当且仅当这一位有m个0,且第n个数这一位为0。

如果这一位可以为0,那么所有这一位为1的数以后都不能选。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 500050
using namespace std;
long long n,m,a[maxn],ans=0,table[70];
bool vis[maxn];
void get_table()
{
    table[0]=1;
    for (long long i=1;i<=63;i++)
        table[i]=table[i-1]*2;
}
int main()
{
    get_table();
    scanf("%lld%lld",&n,&m);
    for (long long i=1;i<=n;i++) scanf("%lld",&a[i]);
    for (long long i=1;i<=n;i++) a[i]^=a[i-1];    
    for (long long i=63;i>=0;i--)
    {
        long long ret=0;
        for (long long j=1;j<=n-1;j++)
        {
            long long bit=a[j]&table[i];
            if ((!(a[j]&table[i])) && (!vis[j]))
                ret++;
        }
        if ((ret>=m-1) && (!(a[n]&table[i])) && (!vis[n]))
        {
            for (long long j=1;j<=n;j++)
            {
                if (a[j]&table[i])
                    vis[j]=true;
            }
        }
        else ans|=table[i];
    }
    printf("%lld\n",ans);
    return 0;
}