码迷,mamicode.com
首页 > 其他好文 > 详细

线性基

时间:2019-11-03 20:31:56      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:维护   math   总结   span   一个   line   代码实现   strong   时间   

uoj 91 最大异或和

要求:维护一个线性基,每次加入一个元素,替换掉最先加入的一个与它 线性相关的 仍然存在的 元素。

考虑现在的线性基中元素为\(b_i\),每次加入的元素为\(a_i\)

\(b_1\) \((b_1=a_{k1} xor a_{k2} xor a_{k3}....)\)

\(b_2\) \((b_2=a_{h1} xor a_{h2} xor a_{h3}....)\)

\(b_3\) \((b_1=a_{g1} xor a_{g2} xor a_{g3}....)\)

.

.

.

我们考虑形式化要求:即每次加入一个\(x\) :

1.若x与当前线性基中元素线性无关,直接加入即可;

2.否则,找到 \(x xor a_{k1} xor a_{k2} xor a_{k3}....=0\) ,将出现时间最靠前的\(a_k\)替换掉

定义

每一个\(b_i\)可以由许多\(a_k\)异或表示,我们定义$ id_i\(为组成\)b_i\(的\)a_k$中出现时间最小的时间

维护

我们现在维护一个线性基,满足对于线性基中每一个元素\(i\)\(id_i\)都不同。

每一次我们将所有的 \(x xor b_{k1} xor b_{k2} xor b_{k3}....=0\),找出来

从高位到低位逐位替换,则时间最靠前的\(a_k\)一定是最小的\(id_k\) ,我们只要将\(b_k\)\(id_k\)最小的替换掉就行了。

我们考虑当前位为\(b_i\) ,如果我们要加入x,可以:

1.将\(x xor b_i\) 向下递归;

2.将\(b_i\)替换成\(x\)(\(id_i\)也替换) ,将\(x xor b_i\) 向下递归;

如果进行1操作,向下递归的\(x xor b_i\)\(id\)值将会改成\(id_i\) ,可我们要求每个\(b_i\)\(id\)值不同,所以1操作不符合要求。

考虑进行2操作,向下递归的\(x xor b_i\)\(id\)值将会改成\(id_i\) ,而原\(b_i\)上的数也\(x\)替换(\(id_i\)也被替换),符合要求。

总结一下(代码实现)

每一次加入元素\(x\) (x的\(id\) 定义为\(id_x\)),找到当前最高位的与\(x\)有关的\(b_i\) :

1.若\(id_x<id_i\) ,将$x xor b_i $向下递归。

2.若\(id_x>id_i\) ,将\(b_i\)替换成\(x\)(\(id_i\)也替换为\(id_x\)) ,将$x xor b_i \((\)id_x$为原来的 \(id_i\) )向下递归。

直到找到一个空位置,将\(x\)插入,等同于插入操作;或\(x\)异或成0,相当于替换操作

线性基

标签:维护   math   总结   span   一个   line   代码实现   strong   时间   

原文地址:https://www.cnblogs.com/zhongzero/p/11788624.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!