【ARC 127 D】Sum of Min of Xor 题解

Description

给定序列 a , b a,b a,b,求

∑ 1 ≤ i < j ≤ N min ⁡ ( A i ⊕ A j , B i ⊕ B j ) \sum_{1 \le i<j \le N} \min(A_i \oplus A_j,B_i \oplus B_j) 1i<jNmin(AiAj,BiBj)

1 ≤ N ≤ 250000 , 0 ≤ A i , B i ≤ 2 18 1 \le N \le 250000,0 \le A_i,B_i \le 2^{18} 1N250000,0Ai,Bi218,时限 5.00s \texttt{5.00s} 5.00s,空限 1024MB \texttt{1024MB} 1024MB

Solution

首先,我们将 ( i , j ) (i,j) (i,j) 分为两类——第一类满足 A i ⊕ A j < B i ⊕ B j A_i \oplus A_j<B_i \oplus B_j AiAj<BiBj,第二类满足 B i ⊕ B j < A i ⊕ A j B_i \oplus B_j<A_i \oplus A_j BiBj<AiAj,第三类满足 A i ⊕ A j = B i ⊕ B j A_i \oplus A_j=B_i \oplus B_j AiAj=BiBj。显然,将这三类的贡献加起来就是答案。

先考虑第一类。

考虑倒序枚举,并将所有的 j j j 放入一个数据结构中。关键在于,对于每个 i i i 求出 ∑ j A i ⊕ A j × [ A i ⊕ A j < B i ⊕ B j ] \sum_j A_i \oplus A_j \times [A_i \oplus A_j<B_i \oplus B_j] jAiAj×[AiAj<BiBj]。不难想到枚举 A i ⊕ A j A_i \oplus A_j AiAj B i ⊕ B j B_i \oplus B_j BiBj 在二进制表示下的最长公共前缀,那么最长公共前缀的长度 s s s 必然是满足 A i , s ⊕ A j , s = B i , s ⊕ B j , s A_{i,s} \oplus A_{j,s}=B_{i,s} \oplus B_{j,s} Ai,sAj,s=Bi,sBj,s(即 A i , s ⊕ B i , s = A j , s ⊕ B j , s A_{i,s} \oplus B_{i,s}=A_{j,s} \oplus B_{j,s} Ai,sBi,s=Aj,sBj,s) 的最大 s s s,其中 A x , y A_{x,y} Ax,y B x , y B_{x,y} Bx,y 分别表示 A x A_x Ax B x B_x Bx 在二进制表示下的前 y y y 位。

于是,我们可以在倒序扫描的过程中,每次在 Trie 树上插入 A i ⊕ B i A_i \oplus B_i AiBi。那么,我们每次只要在 Trie 树上定位到相应的节点,那么我们就找到了所有的满足 A i , s ⊕ A j , s = B i , s ⊕ B j , s A_{i,s} \oplus A_{j,s}=B_{i,s} \oplus B_{j,s} Ai,sAj,s=Bi,sBj,s j j j

固定完 s s s 后,我们还要保证 A i , s + 1 ⊕ A j , s + 1 < B i , s + 1 ⊕ B j , s + 1 A_{i,s+1} \oplus A_{j,s+1}<B_{i,s+1} \oplus B_{j,s+1} Ai,s+1Aj,s+1<Bi,s+1Bj,s+1。不难发现,这个式子让我们固定了 A j , B j A_j,B_j Aj,Bj 在第 s + 1 s+1 s+1 位上的值——从而,我们只需要使用一个“Trie 套桶”的结构,对于每个 Trie 树上的点开一个小桶,存储对应位上 ( 0 , 0 ) ( 1 , 1 ) ( 0 , 1 ) ( 1 , 0 ) (0,0)(1,1)(0,1)(1,0) (0,0)(1,1)(0,1)(1,0) 出现的次数。

于是我们解决了第一类情况。第二类同理。第三类十分容易,这里不再赘述。

若令 m = 2 18 m=2^{18} m=218,则每次插入都是 O ( log ⁡ 2 m ) O(\log^2 m) O(log2m) 的,每次查询也是 O ( log ⁡ 2 m ) O(\log^2 m) O(log2m) 的,从而总时间复杂度为 O ( n log ⁡ 2 m ) O(n \log^2 m) O(nlog2m)。空间复杂度为 O ( n log ⁡ m ) O(n \log m) O(nlogm),可以通过本题。

PS: 话说这题能不能做到 O ( n log ⁡ m ) O(n \log m) O(nlogm) 啊?蒟蒻求教/kel

Code

咕咕咕

猜你喜欢

转载自blog.csdn.net/Cherrt/article/details/121588116