Official

D - Sum of Min of Xor Editorial by maroonrk_admin


\(L=18\) とし,すべての数は(2進で) \(L\) 桁だとします. なお,ある数の \(k\) 桁目,といったときには,下から\(0\)-based index で \(k\) 番目の桁を指すことにします.

\(A_i \oplus A_j\)\(B_i \oplus B_j\) が(上から見ていって)最初に異なる bit を考えます. これは,\(A_i \oplus A_j \oplus B_i \oplus B_j\) の最上位 bit です.

\(C_i = A_i \oplus B_i\) と 定義しておきます. \(C_i\)\(W\)(\(=L-1\)) 桁目が \(0\) である \(i\) の集合を \(S\)\(1\) であるような \(i\) の集合を \(T\) と置きます. \(i,j \in S\) もしくは \(i,j \in T\) を満たすペア \((i,j)\) の寄与は,\(W:=W-1\) とした上で,\(S,T\) それぞれで再帰的に計算することにします.

\(i \in S,j \in T\) なる \(i,j\) のペアの寄与を考えます. \(i \in S\) の中でさらに,\(A_i\)\(W\) 桁目が \(0,1\) のものを集めてそれぞれ \(S_0,S_1\) と呼ぶことにします. 同様に,\(T_0,T_1\) を定義します. この時,各 \(0 \leq x,y \leq 1\) について,どの \(i \in S_x,j \in T_y\) についても,\(A_i \oplus A_j\)\(B_i \oplus B_j\) のどちらが小さいかが一意に定まります.

よって,各 \(V=S_0,S_1,T_0,T_1\) について,以下の値を計算しておけばおいです.

  • \(0 \leq j < L\) について,\(A_i,B_i\)\(j\) bit 目の分布.

計算量は全体で \(O((N+2^L) L^2)\) になります. (\(C_i=C_j\) なる \(i,j\) の寄与について説明していませんが,これは簡単なので省略します.)

posted:
last update: