zoukankan      html  css  js  c++  java
  • P4301 [CQOI2013] 新Nim游戏

    https://www.luogu.com.cn/problem/solution/P4301

    结合一般的 nim 游戏,考虑什么时候对手能获胜:自己第一次取完以后,对手能在剩下的数中找到一个子集使得其异或和为零
    那么根据线性基的性质,如果某一次插入失败了(一直被异或到零也没插入数组的某个元素中),则说明存在一种构造异或和为零的方案中用到这个插入的数,那么这个数必须取走
    要求取走的数大小和最小,所以从大到小贪心的插入,能插入就插入,否则就拿走

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<map>
    #define reg register
    #define LL_INF (long long)(0x3f3f3f3f3f3f3f3f)
    #define INT_INF (int)(0x3f3f3f3f)
    inline int read(){
    	register int x=0;register int y=1;
    	register char c=std::getchar();
    	while(c<'0'||c>'9'){if(c=='-') y=0;c=getchar();}
    	while(c>='0'&&c<='9'){x=x*10+(c^48);c=getchar();}
    	return y?x:-x;
    }
    int n;
    int base[33],a[106];
    inline int insert(int x){
    	int backup=x;
    	for(reg int i=30;~i;i--)if(x&(1<<i)){
    		if(!base[i]){base[i]=x;break;}
    		else x^=base[i];
    	}
    	return (!x)?backup:0;
    }
    int main(){
    	n=read();
    	for(reg int i=1;i<=n;i++) a[i]=read();
    	std::sort(a+1,a+1+n);
    	long long ans=0;
    	for(reg int i=n;i;i--) ans+=insert(a[i]);
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    git的使用
    免安装版mySQL的安装及配置
    Eclipse中安装freemarker插件
    freemarker配置
    Matlab机器人工具箱安装教程
    书籍推荐
    电影推荐
    自走棋地精猎玩法
    wineqq中接收文件的查看与移动
    windows和linux键值表
  • 原文地址:https://www.cnblogs.com/suxxsfe/p/14555765.html
Copyright © 2011-2022 走看看