contents
Problem
給一長度為 $N$ 的整數序列,詢問任意區間的極端異或和 Extreme XOR Sum。
定義 Extreme XOR Sum 為一系列操作的最後一個值
- 當長度 $n>1$ 時,將陣列縮小為 $n-1$
- 對 $[a_0, a_1, a_2, \cdots, a_{n-1}]$,每一個元素與後一個元素運行互斥或,將會被轉換成 $[a_0 \oplus a_1, a_1\oplus a_2, a_2 \oplus a_3, \cdots, a_{n-2}\oplus a_{n-1}]$
- 直到只剩下一個元素,即為 Extreme XOR Sum
Sample Input
|
|
Sample Output
|
|
Solution
這題詢問次數非常多,一般運行將對每一個詢問達到 $O(N)$ 的複雜度,這很容易得到 TLE。從大多的數據結構,如線段樹、塊狀表 … 等,他們提供高效率的查找效能,但也必須符合某些條件才能使用。因此,在此題若要符合結合律將變得相當困難。
觀察
假設要計算陣列 $[1, 4, 6, 7, 8]$ 的值時
- 第一步,$[1 \oplus 4, 4 \oplus 6, 6 \oplus 7, 7 \oplus 8]$
- 第二步,$[1 \oplus 4 \oplus 4 \oplus 6, \cdots]$
- 如此類推下去,XOR 有結合律,我們發現到各別使用了 1 次 $a_0$、4 次 $a_1$、6 次 $a_2$、4 次 $a_3$ 和 1 次 $a_4$
對於不同的長度,我們發現到是二項係數的配對情況。由於偶數次的 XOR 會互消,只需要計算出現奇數次的即可,因此我們列出二項次數模二的情況,進而得到 Sierpinski triangle/Sierpinski sieve。即使知道 Sierpinski sieve 是二項係數模二的結果,我們仍不知道要怎麼套用結合律達到剖分加速的條件。
二項係數的公式如下
$$\begin{align*} \binom{n}{m} &= \binom{n-1}{m-1} + \binom{n-1}{m} \\ 			&= \frac{n!}{m!(n-m)!} \end{align*}$$階層運算在數學運算上的性質並不多,逼得我們只好往碎形上觀察,以下列出前幾項的結果
|
|
發現它是一個很有趣的碎形,每個三角形大小都是以二的冪次的。我們按照 $2^3 = 8$ 切割一下上圖,並且把右邊斜的補上 0 得到下圖。
|
|
得到數個一模一樣的子圖,上述全零和非零的區塊,又恰好構成 Sierpinski sieve。這告訴我們任何操作全都要以二的冪次為基準,且合併區段時須以二項係數為係數。設定 pattern 大小為 $M=2^{\lceil \log_2 N\rceil}$,最後得到 miniature pattern。在同一層中,非零構成的條紋都是相同的模式,例如上述得圖中,最後一層的箭號組合必然是 101 或者是 000,最後得到下列公式計算條紋。
$A_{i, j} = A_{i-1}{j} \oplus A_{i-1,j+M}$接下來,我們將需要確定每一個條紋 (stripe) 是否使用全零或者非零,只需要查找 miniature pattern 相應的係數即可。
如何在 Sierpinski sieve 找到非零係數的位置
若 $\binom{n}{i} \mod 2 = 1$,必滿足 $n\&i = i$。其證明從數學歸納法來,由二冪次的長度碎形著手,移除最高位的 1 得到 $i'$,從 $i'$ 舊有位置集合,保留此集合,並對每一個元素增加二的冪次得到碎形的另一邊。
故可利用下述算法,準確地找到每一個非零的係數位置
|
|
最後附上優化後得到 Rank 1 的程序 0.040 s
|
|