线性基专题总结

莫(tui)名(wan)其(ti)妙(jie)又弄完了一个专题?

刚开始以为这个知识点出题都是板子来着,后来做题才发现我太天真了啊

先列知识点吧

  • 1.性质
    (1). ?原序列异或能得到的所有数都可以由线性基中的一些数异或得到
    (2).?线性基里面的任意一些数异或起来都不能得到 \(0\)
    (3).?线性基里面的数的个数唯一,并且在保持性质一的前提下,数的个数是最少的
    (4).?若线性基中有k个元素,则原序列异或能得到的数一共有 \(2^k\) 种,每种有 \(2^{n-k}\) 个
    (5).?线性基中元素互相异或,异或集合不变

?

  • 2.构造
    从高到低扫描线性基中的每一位
    如果这一位没有值但是 \(x\) 的这一位有值,则令线性基这一为 \(x\)
    否则令 \(x=x \ xor\ b[i]\)
    ? 放个代码
inline bool insert(ll x){
    for(int i=63;i>=0;i--){
        if(x&(1ll<<i)){
            if(!d[i]){
                d[i]=x;
                return 1;
            }
            else x^=d[i];
        }
    }
    return 0;
}

?

  • 3.使用

? 求异或最大(最小)值
从高到低(低到高)扫描线性基中的每一位,如果 \(x\ xor\ b[i]>(<)x\)?则令?\(x=x \ xor\ b[i]\)

?

? 求第 \(k\) 小值
先处理一下,使得线性基中每一个元素作用都变为提供他的最高位元素
具体实现中,我们从低到高处理每一位 \(i\),然后枚举 \(0~i-1\) 如果 \(b[i]\) 的第 \(j\) 位为 \(1\),则 \(b[i]=b[i]\ xor\ b[j]\)
求解的时候,将 \(k\) 先转成二进制,假如 \(k\) 的第 \(i\) 位为 \(1\),\(ans\) 就异或上线性基中第 \(i\) 个元素

?

求 \(x\) 的排名
和上面一样的处理
然后一样从小到大枚举每一位,尝试用线性基中的数表示 \(x\)
若当前是线性基中的第 \(i\) 个数,则 \(ans+=1<<i\)

?

据说能删除?我不会啊。。。。。。咕咕了

?

  • 4.题解包

元素
?题目描述:有一些物品,有权值和序号,求序号全部非空子集异或和不为0的情况下最大的权值和
?把物品按照权值从大到小排序,尝试插入线性基就行了

?

\(shallot\)
?题意描述:小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏。
??每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,
??并且让小葱从自己手中的小葱苗里选出一些小葱苗使得选出的小葱苗上的数字的异或和最大。
??这种小问题对于小葱来说当然不在话下,但是他的身边没有电脑,于是他打电话给同为 \(OI\) 选手的你,你能帮帮他吗?
??你只需要输出最大的异或和即可,若小葱手中没有小葱苗则输出 \(0\) 。
?虽然我不会删除但是我会撤销啊
?线段树分治一下就完了

?

幸运数字
?题意描述:求树上某条路径上的最大异或和
用倍增数组来维护线性基就行了

?

\(albus\) 就是要第一个出场
?题意描述:求某个数在原序列所有异或和中的排名
性质4+查排名就没了

?

玛里苟斯
?题意描述:对序列中所有子集异或和 \(x\) ,求 \(\sum x^k\)
毒瘤题啊
正解是测试点分治

  • 1.\(k==1\)
    发现只要原序列中某些数二进制第 \(i\) 位不为 \(0\),则这一位是否为 \(0\) 的概率都为 \(\frac{1}{2}\)
    枚举一下就好了
  • 2.\(k>=3\)
    由于最终答案 \(<2^{63}\),所以原序列的数位数不可能超过 \(21\) 位
    暴力枚举选线性基的每一项就行了
  • 3.\(k==2\)
    如果分开考虑每一位,则 \((b_1+b_2+b_3+...+b_{63})^2=\sum\limits_{i=1}^{63}\sum\limits_{i=1}^{63}b_ib_j\)
    考虑暴力枚举每两位,如果存在某一个数的第 \(i\) 位与第 \(j\) 位不相等,则对答案的贡献为 \(\frac{1}{4}\),否则为 \(\frac{1}{2}\)
    注意虽然结果不会爆 \(unsigned\ \ long\ \ long\),但是过程会爆。。。。。。

?

梦想封印
?题意描述:给定一张无向图,边带边权,问删掉某些边后从原点出发的路径异或和不为 \(0\) 的有多少种
?图很不兹瓷啊,考虑维护一棵树
?删边很不友好啊,考虑时光倒流,删边变成加边
?然后正式开始做题
?发现是路径异或和那么可以发现一个结论:每个环可以和任意一条和他联通的路匹配(异或的性质)
?那么我们可以考虑对于环和路径分开来考虑
?对于每个环,可以视作一个物品,把他们插入线性基中这样贡献为 \(2^cnt\)
?对于每条路径,可以很容易处理出来 \(1\) 号点到每个点 \(x\) 的异或和 \(dis_i\),
?把这个 \(dis\) 在线性基里消除可以用线性基表示的部分然后插入 \(hmap\) 就行了
?注意每次成功插入线性基后需要更新 \(hmap\)
?答案为 \(size\times 2^{cnt}\)

?

\(DZY\ \ Loves\ \ Chinese\ \ II\)
?题意描述:给定一张无向图,每次询问删掉某些边后图是否联通
?真正的线性基好题你根本看不出是线性基
?还是考虑维护一棵树
?发现不联通的有这两种情况
?? 1.同时割掉一条树边和所有覆盖它的非树边
?? 2.同时割掉被相同集合覆盖的两条树边
?我们考虑这样构造
?给每条非树边不同的权值,给树边赋值为所有覆盖它的非树边权值异或和
?发现当边权范围足够大的情况下如果某个被删除边集的异或和为0则图不联通
?这玩意可以用线性基来判断

原文地址:https://www.cnblogs.com/mikufun-hzoi-cpp/p/12121575.html

时间: 2024-10-10 07:02:12

线性基专题总结的相关文章

「专题总结」线性基

为什么要把毫无关联的线性基和群论放在一个专题里呢..? 因为它们都很毒瘤 线性基本身还是比较简单的,用于处理一些数子集异或和的集合有哪些. 然而它的考察方法总是很神奇... 题目难度大致升序,但是没有前置知识关系: 元素: $Description:$ 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力越强,但物极必反:有时,人们为了获取更强的法力而使用了很多矿石,却在炼制

Xor HYSBZ - 2115 (线性基)

Xor HYSBZ - 2115 题意:给一个树,求1到n的最长路径.这里的路径定义为异或和. 线性基~~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 struct LiBase{ 5 ll a[63]; 6 //初始化 7 void init(){ 8 memset(a,0,sizeof(a)); 9 } 10 //插入 11 bool insert_(ll x){ 12 for(int

线性基小节

1.线性基的异或集合中每个元素的异或方案唯一. 2.线性基二进制最高位互不相同. 3.线性基中元素互相异或,异或集合不变. 摘自百度文库 线性基能相互异或得到原集合的所有相互异或得到的值. 线性基是满足性质1的最小的集合 线性基没有异或和为0的子集. 证明: 反证法:设线性基S={a1,a2...,an}: 若有子集a1^a2^...^at=0,则a1=a2^a3^...^at,则舍弃a1后一定能通过剩余的元素异或出所有需要a1参与异或的值.设Y=a1^X,因为{a1,a2,...,an}是一组

[BeiJing2011]元素[贪心+线性基]

2460: [BeiJing2011]元素 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1245  Solved: 652[Submit][Status][Discuss] Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石.一般地,矿石越多则法力越强,但物极必反:有时,人们为了获取更强的法力而使用了很多矿石,却在炼制过程中

BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高斯消元判断是否和已选择的线性相关 每一位记录pivot[i]为i用到的行 枚举要加入的数字的每一个二进制为1的位,如果有pivot[i]那么就异或一下(消元),否则pivot[i]=这个数并退出 如果最后异或成0了就说明线性相关... #include <iostream> #include &l

【BZOJ2844】albus就是要第一个出场 线性基 高斯消元

#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/43456773"); } 题意:需要注意的是空集(0)是天生被包括的,我为了这个WA了好久~拍了好久,醉了好久~ 题解: 首先有一个我并不知道是为什么(甚至不知道它对不对)的性质: 每一种权值会出现2的自由元(n-线性基个数)次方 次. 感性

[bzoj 2460]线性基+贪心

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2460 网上很多题目都没说这个题目的证明,只说了贪心策略,我比较愚钝,在大神眼里的显然的策略还是想证明一下才安心--所以这里记录一下证明过程. 贪心策略:按魔力值从大到小排序,从大往小往线性基里插,如果成功插入新元素,就选这个,如果插不进去,就不选这个. 证明: 设有n个材料,每个材料的属性值是x[1],x[2],...,x[n],魔力值是v[1],v[2],...,v[n],这里假设v已

BZOJ 2460 元素(贪心+线性基)

显然线性基可以满足题目中给出的条件.关键是如何使得魔力最大. 贪心策略是按魔力排序,将编号依次加入线性基,一个数如果和之前的一些数异或和为0就跳过他. 因为如果要把这个数放进去,那就要把之前的某个数拿出来,而这样交换之后集合能异或出的数是不会变的,和却变小了. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector

线性基 学习笔记

ps:做CF的时候碰到了一个线性基的概念,然后在网上学习了一下,发现相关的资料很少,所以打算来写一个我个人的理解. 线性代数中 有极大线性无关组和空间的基的概念.  线性基的性质与此类似. 首先来看一个问题: 给出N个数,要从中选出一个最大的子集,使得子集中的任意个元素异或值不为0. 这个和极大线性无关组有些类似.异或可以看出是模2域下的加法运算,如果把一个数转化为二进制,对应成一个由01构成的向量, 所有这些向量就构成了一个线性空间. 原问题就转化为求这个向量组的极大线性无关组,把这样一个极大