zoukankan      html  css  js  c++  java
  • CQOI2013 新nim游戏

    题目链接:戳我

    首先我们可以转化一下题面——
    找一个最大的子集,使得这个子集中的子集异或和均不为0.
    或者
    删除尽可能少的数,使得剩下的数的子集异或和不为0.
    所以就是一个数一个数看,看如果加入进去之后会和一部分数构成异或和为0的情况,就把这个数作为删去的堆。
    用线性基维护就行了。
    但是我们要删去的数的和最小,所以我们先从大到小排序,这样子的话可以保证如果一些数构成异或和为0,我们计算到答案里的一定是这些数里面最小的那个。qwq

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #define MAXN 100010
    using namespace std;
    int n;
    int a[MAXN],p[MAXN];
    long long ans;
    inline bool cmp(int x,int y){return x>y;}
    inline void insert(int x)
    {
        for(int i=31;i>=0;i--)
            if(x&(1<<i))
            {
                if(!p[i]){p[i]=x;break;}
                x^=p[i];
            }
    }
    inline int query(int x)
    {
        for(int i=31;i>=0;i--)
            if(x&(1<<i))
                if(p[i]) x^=p[i];
        return x;
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("ce.in","r",stdin);
        #endif
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(&a[1],&a[n+1],cmp);
        for(int i=1;i<=n;i++)
        {
            if(query(a[i])==0) ans+=a[i];
            else insert(a[i]);
        }
        printf("%lld
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    js 根据屏幕大小调用不同的css文件
    centos U盘安装查看名称
    gmail只能收,不能发解决
    pytty秘钥登陆
    GCP 免密钥登陆
    iredmail安装资料整理
    centos修改本地hostname(主机名)
    chmod 774
    centos 环境部署
    epel更新源
  • 原文地址:https://www.cnblogs.com/fengxunling/p/10868215.html
Copyright © 2011-2022 走看看