bzoj 2741: 【FOTILE模拟赛】L(可持久化trie + 分块优化)
预处理 a a a 数组的前缀和,问题就变成在[l - 1,r] 区间内找任意两个数,使得异或值尽可能大。 用可持久化 trie 暴力做 复杂度是 O ( 32 ∗ n ∗ m ) O(32 * n * m) O ( 3 2 ∗ n ∗ m ) 即使去掉 32 这个系数,也可能会被卡常,考虑如何优化。 考虑预处理一部分区间的答案,令 f [ l ] [ r ] f[l][r] f [ l ] [ r ] 表示 区间 [ l , r ] [l,r] [ l , r ] 的答案,显然不能预处理全部的区间,考虑分块预处理:对 l 分块(或者对 r 分块),f[l][r] 表示 从第 l 个 块的起点到 r 这段区间内 与 a[r] 异或的最大值。g[l][r] 表示 从第 l 个 块的起点到 r 这段区间内的答案。 通过 f[l][r] 和 g[l][r - 1] 可以得到 g[l][r],因此可以边搞边处理。 对于每一次询问[l,r],找到 l 所在块号的右边界 e d ed e d ,对于 [ed + 1,r] 的答案已经预处理过,枚举 [l,ed] 每一个点,在可持久化 trie 上查询 区间 [l + 1,r] 与 a[l] 异或可得到的最大值,[ed + 1,r]的答案合并即得到[l,r] 的答案。 复杂度: O ( 30 ∗ n n + 30 ∗ m ∗ n ) O(30*n