标签:维护 math 总结 span 一个 line 代码实现 strong 时间
要求:维护一个线性基,每次加入一个元素,替换掉最先加入的一个与它 线性相关的 仍然存在的 元素。
考虑现在的线性基中元素为\(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