zoukankan      html  css  js  c++  java
  • 【BZOJ】3105: [cqoi2013]新Nim游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3105

    题意:k堆火柴,先手和后手在第一次拿的时候都能拿若干整堆火柴(但不能拿完),之后和nim游戏规则一样。问先手是否必胜且第一次最少拿多少能保证必胜。(k<=100)

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll ans;
    int s[105], a[105], n;
    bool cmp(const int &a, const int &b) { return a>b; }
    int main() {
    	scanf("%d", &n);
    	for(int i=0; i<n; ++i) scanf("%d", &a[i]);
    	sort(a, a+n, cmp);
    	for(int i=0; i<n; ++i) {
    		int t=a[i];
    		for(int j=31; j>=0; --j) if((t>>j)&1) {
    			if(!s[j]) { s[j]=t; break; }
    			t^=s[j];
    		}
    		if(!t) ans+=a[i];
    	}
    	printf("%lld
    ", ans);
    	return 0;
    }
    

      

    复(xue)习(xi)了下花神的冬令营课件。

    先手只需保证拿完后不存在xor为0的子集即可,因此保证有解。

    定义拟阵$M=(E, I)$,$E$就是给出的元素,权值为元素本身。$I = {X | X subseteq E, forall Y subseteq X 都满足xor意义下线性无关(即没有子集能xor为0)}$。

    那么本题就是求最大权值独立集(即最大权值的基)

    证明$M$是一个拟阵:

    遗传性:显然满足

    独立集的交换性:令$A, B in I$且$|A| > |B|$。由于$A$中元素线性无关,将$A$中元素按位放入矩阵,显然矩阵的秩为$|A|$。$B$同样,但是$B$的矩阵的秩$=|B|<|A|$,也就是说我们只需要将任意一个在$B$矩阵没有的位从$A$中找一个这个位为$1$的元素放入即可,使得$B$矩阵秩$+1$,因此$B$并上这个元素也是一个独立集,得证。

    那么我们按权值排序从大到小加入即可~

    如何判断线性无关呢?高斯消元(可以看做求秩矩阵)

  • 相关阅读:
    React 高阶组件
    React Context(执行上下文)
    解决背景图片半透明(rgba)兼容性
    js基础复习---数组操作
    js基础复习---字符串操作
    escape()、encodeURI()、encodeURIComponent()区别详解(转)
    form data和request payload的区别(转)
    关于把时间搓转化为时间
    关于js 获取本地当前时间问题
    关于html 头部meta标签。
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/4381928.html
Copyright © 2011-2022 走看看