01trie专题
01trie特训2
题意:给定一个含有 n 个元素的数组 Ai,你可以选择两个不相交的子段。求出这两个子段内的数的异或和的差值的最大值。
Sol:考虑枚举两段的分界点,对于较短的两段来说可能会有多个分界点但这样我们求的是答案的超集,一定会包括答案的。对于一个分界点,我们先考虑如果要求以左边区间必须包含分界点,那么我们只需要异或前缀和后找一个位置和它异或最大或最小,这是经典的01trie的应用。再考虑右边,我们需要做后缀异或和,做跑一遍trie。注意实际上可以不以分界点为选取的子段的端点,我们需要需要维护异或后结果的前缀最大值,后缀最小值,剩下同理。
debug:我自己实现不好写的原因是没开第二个后缀异或和,在那一直用前缀和偏移位置,边界不好处理。
https://www.luogu.com.cn/problem/U109923给定一个长度为 的数列 ,选定四个整数 ,则函数 的计算方式如下:
对于所有符合条件的
Sol:上面的题和这个题非常像,这个维护和最大的非常直接,我们还是枚举分界点,固定端点求前缀异或和的单点最大值,再更新成前缀后缀最大值。后缀完全不需要特殊处理,直接对称的从后往前做异或和,并更新,没有顺序问题。
有一个初始为空的可重集 。现在有 次操作,每次操作有 种类型,分别是:
-
,把 加入 。 -
,将 从 中删除,保证在删除前 已经在 中。 -
,询问 中有多少个数按位异或上 的结果小于 。
Choosing The Commander - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
Sol:对于前两个操作只需要开一个数组,每次在树上走的时候维护标记。对于第三个操作有点像在线段树二分上的感觉,都是计算一边的答案,然后递归到另一边。
具体来说,我们在 的某位为1的时候才有机会让某些数 使得其小于 ,所以我们要在每一个节点上维护当前左右儿子的节点数量。
Tokitsukaze 有一个长度为
她想知道有多少种序列
有了前面的铺垫看这个题就觉得还行了,先给出官方题解
Sol:由于求的是子序列,套路的,我们可以对 进行排序。 排序后发现,当 时,中间数可以随便选,如果这组 min 与 max 满足条件,那么答案是 ,特别的,当 时,答案是 。 但这个做法既要枚举 min 又要枚举 max,是 的。遇到这种情况,优化思路大多都是枚举一个,快速查询另一个。由于条件是异或,我们考虑 01字典树 (01 Trie)。把比当前枚举的 小的数全部插入进 Trie 里,这样每次就能在 的时间复杂度内求出所有满足条件的 min 的信息。 此时又有新的问题:怎么用 Trie 维护答案信息呢? 对于一个 ,它贡献的答案为 。我们可以将这个式子拆掉: ,于是 与 就分离了。所以我们可以把 插入 。当 时,在 Trie 中查询 , ,此时贡献为 。 与 都可以预处理求出 ( 要用到逆元)。然后枚举 max,每次在 Trie 中查询,总时间复杂度为 。
我的理解:每个节点维护记录的的不再是简单的数量,而是分离变量以后的贡献函数。
- 注意全局变量与局部变量重名可能会出大问题,避免。
- 多测数据下如何清空01trie,根据idx用到哪清理到哪。
debug:init函数中用到变量n,但n首先是变化的并且还没输入呢。所以应该直接给边界常量。
__EOF__

本文作者:爱飞鱼
本文链接:https://www.cnblogs.com/mathiter/p/18199402.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/mathiter/p/18199402.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】