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

「线性基」

时间:2020-02-24 20:15:11      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:math   第k小   操作   支持   倍增   开始   存在   路径   线段树   

线性基是极小的能异或出任意元素异或出来的值的集合.
线性基可以合并,不是很可以支持删除,但看过相关的博客好像有神仙可以.
删除可以弄存活区间然后线段树.
设线性基中有i个元素,那么共有\(2^i\)种异或值,每种值出现了\(2^{n-i}\)次.
异或值最大就从高位往低位贪心选取,如果当前答案没有这一位就异或上.
异或值最小就是最低存在位的答案.
取异或d的最大值,把异或值最大的初值赋成d.
取第k小值.
先把线性基上的元素化作最小的形式.
也就是说,每个数都是有这一位的最小的数了.
那么,我们类似倍增lca求lca的思路,从大的二进制位开始枚举.
如果k>1<<i,就异或上这个数,同时相当于k-=1<<i.
每一个有数的位都相当于是一次线段树上向两边中一边的选择的操作.
这一位选1,或者不选1都各有1<<i个数.
如果选了1,就有这一位选0的1<<i个数比它小,所以k必须能&1<<i.
对于图上的异或路径数,可以转换成树,然后有若干个环在线性基里随便异或.

1.梦想封印

「线性基」

标签:math   第k小   操作   支持   倍增   开始   存在   路径   线段树   

原文地址:https://www.cnblogs.com/hzoi2018-xuefeng/p/12358401.html

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