zoukankan      html  css  js  c++  java
  • bzoj4245: [ONTAK2015]OR-XOR

    一道很有意思的题目。

    先求一次前缀和,可以发现答案是 (sum[0] xor sum[x1])or(sum[x1] xor sum[x2])or(sum[x2] xor sum[x3])or……or(sum[m-1] xor sum[n])

    然后其实(a xor b)or b =a or b

    那么sum[0]=0,可以把柿子变成 sum[x1] or sum[x2] or …… or sum[m-1] or sum[n]

    问题就变成取m-1个数,使和sum[n]它们or起来最小

    从高位往低位贪心即可

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    LL s[510000];
    bool v[510000];
    int main()
    {
        int n,m;LL x;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%lld",&x), s[i]=s[i-1]^x;
        
        m--;LL ans=s[n];
        memset(v,true,sizeof(v));
        for(int i=62;i>=0;i--)
        {
            if((ans&(1LL<<i))==0)
            {
                int sum=0;
                for(int j=1;j<n;j++)
                    if(v[j]==true)
                        if((s[j]&(1LL<<i))==0)sum++;
                if(sum>=m)
                {
                    for(int j=1;j<n;j++)
                        if(v[j]==true)
                            if((s[j]&(1LL<<i))>0)v[j]=false;
                }
                else ans|=(1LL<<i);
            }
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    PAT:1002. 写出这个数 (20) AC
    PAT:1031. 查验身份证(15) AC
    PAT:1021. 个位数统计 (15) AC
    NSDate
    iOS程序的生命的周期
    Swift swith语句
    Swift 循环语句
    Swift 基本运算符
    Swift 解包
    Swift 可选类型(补充)
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/8945163.html
Copyright © 2011-2022 走看看