OI中的线性代数
OI中的线性代数
线性基
Example1
给定
考虑将每个数的质因子压成一个二进制数,那所求也就是问有多少种选取子集的方式使得子集内二进制数异或和为
但是直接做线性基不太对,因为质数级别是
复杂度
Example2([CF1100F]Ivan and Burgers)
考虑扫描线,这样我们需要解决如何询问一段后缀
考虑有一个暴力是直接把每个后缀的线性基建出来:注意在此过程中,能放到高位的数字一定出现地尽可能靠后,因为它一早就被放进来了.而只要满足这个条件,也就是能放高位的一定尽量放高位,并且高位出现时间要尽可能晚,那我们自然就得到了此时的线性基,删去那些出现太靠前的数字就行.
但有没有什么直接一点的理解方式呢?一个直觉是,我们现在要把出现时间太早的给删了,那肯定想要让高位出现时间尽可能晚.但是这样会有两个问题:
-
可能
较小但是没那么小,高位即使不顶替,也会被选上,但是顶替了高位就无法顶替一个将被删除的低位. -
由于线性基并非最简线性基,我们最后的答案有可能不会将某一位异或进答案,那此时尽量最优化它是不优秀的.
-
线性基中的元素不能受到非线性基中的元素的影响,我们删除一位的时候,这一位有可能在之前影响了比它低的一些位置.
来一个一个解决.
(3)是最好解决的.对于因为出现时间太早而导致的删除来说,因为如果一个位置被高位影响了,根据我们的构造过程,这个位置出现时间必然不会晚于那个高位,高位都被删了,那这个位置也会被删.
对于因为被其他人而取代导致的删除来说,因为它被删了,因此它一定可以表示为其它线性基底的异或,因此有影响也无所谓.
再来看(1),考虑我们当前插入的数字是
接下来是(2),考虑上面这个过程完全不耽误你把它变成最简线性基,最简线性基就没这个问题了.
当然这题还可以分治,注意到用线段树直接合并区间的线性基的复杂度达到了
Example3(luoguP8337 [Ynoi2004] rsxc)
注意到区间数字种类个数一定是二的整数次幂,假设为
首先根据CF1100F,我们可以离线找出区间的线性基,这意味着区间不同整数个数是否是
做完这两步之后呢?我们接下来需要求和.这里注意到随着扫描线的进行,左端点可能合法的区间左右端点均单调不降,我们对着二维坐标系做一个差分(就是把一条直线延伸到
这里详细解释一下上面的那个套路:当我们插入一个数字的时候,每当遇到了一个此位置是
Example4([uoj703]赵云八卦阵)
用一下构造能力不难发现,每个点的取值是它前面的数能表示出的所有数(也就是线性基)异或上他自己.
我们考虑从左往右加线性基(并保存旧的版本),每次如果一个数并不能更新线性基,说明这个数字能取的取值范围就是到它的线性基中的所有数字.进一步地,你注意到它的取值范围一定包括了它前面的所有数字,这个同样可以通过线性基的性质来得到.
注意到难点在于那些加入后更新线性基的点,称它们为关键点,这样的关键点最多
也就是说对于一个非关键点,能选则一定要选.因此我们直接从后往前dp,如果遇到关键点的话讨论一下它选不选,遇到非关键点一定要选,如果选不了就更新答案.
我们不妨设计一个dp,设
-
对于一个数字
,找到线性基中最大的小于它的数字. -
对于一个数字
,将它与线性基中若干基底异或得到 ,使得 并且 尽可能大.
不难发现第一个问题就是第二个问题中的
杂题
Example1([CF1270I]Xor on Figures)
首先我们发现,它的平移操作和矩阵很相似,我们考虑将操作写成矩阵形式.
具体地,我们定义新的矩阵乘法为:
定义矩阵
我们看到这个形式,发现它很优美,这个时候自然有一个猜想:
注意到
接下来我们只需要证明这个结论就行.其实也好证:注意到进行一次运算后,
进行
根据上面的证明过程不难发现,
Example2([Petrozavodsk Winter-2014. Moscow SU Tapir Contest(openstrain contest 1435) F]Passing Finals)
给定一个
如果
同理,如果
逆矩阵求解线性方程组
如果我们已知线性方程组的系数矩阵,但是多次询问,每次会给出不同的常数项,我们可以使用下文中提到的逆矩阵来求解.
Example1(codeforces CF1266H Red-Blue Graph)
如果我们设
化简一下:
注意到这是一个系数恒定且常数项不确定的矩阵,可以先矩阵求逆再做.
另外有一个问题是,怎么证明这个系数矩阵一定存在逆矩阵,不难注意到这是个基尔霍夫矩阵,显然
这也就是说,我们一定可以求出唯一一组解.我们要做的只是判定它是否合法.
先通过数学归纳等方法证明一组满足流量平衡以及以下条件的
对于任意一个点,都存在一条只经过激活边的路径到达最终点.
首先充分性,如果满足这个条件,我们只要不断地退流就可以得到一组一定合法的答案.
然后必要性,如果存在一个点没有这条路径,那这个点也必然不可能被回溯到,自然不可能出现一组解.
这题关键在于发现流量平衡这个等价条件,然后知道我们可以求出一组状态,并只需要判定状态是否合法,找判定条件.
然后写分数的人被卡常了,泪目.
评论