array-value

赛时想到了二分+trie但是却没有想到怎么维护啊

看到异或,可以想位运算,trie和异或基。跟位运算肯定没啥关系,而异或基是选任意多个数进行异或,trie是两个数进行异或,所以这道题目用trie

二分,考虑是否存在至少k个区间不超过mid

check函数:我们枚举区间的右端点r,找到一个最大的l使得alarmid,那么如果区间左端点是[1,l],肯定都可以被统计(当然区间左端点也可能是[l+1,r1],这种情况我们之后处理,先找出必要条件)

如何找到l?我们对trie树上的每一个点记录一个值表示这个点的子树所代表的a的最大的位置。将armid放在trie树上查找。此时trie树已经插入了a1 ~ ar1,我们从高位到低位进行查找,假设我们当前查找到了第i位,且从第i+1位到最高位我们当前异或出来的数都与mid的第i+1位到最高位相同,那么对于第i位:

如果mid的这一位为1,显然我们ar的这一位同方向走到底的任何一个位置都可以,所以将同方向子树位置最大值记录在答案中,然后向反方向子树走一步

如果mid的这一位为0,我们只能朝ar的这一位同方向子树走

注意处理走的时候无解的情况

对每个r都处理完后,我们还要处理一下上面括号中说的情况。设f[i]表示以i为右端点,最大的左端点满足[f[i],i]这个区间符合条件(也就是说[f[i]+1,i]这个区间存在一对数使得异或值大于mid),假设1 ~ i1已经处理好了,那么对于新增加的if[i]要么是之前我们找到的l,要么是f[i1],取最大值就好了

posted @   最爱丁珰  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示