公式

A - XOR Cross Over 解説 by chinerist


列を分割して一方の総 \(\mathrm{XOR}\) を他方の各要素に加えていくことを、列がすべて長さ \(1\) になるまで行い続ける、という操作です。

列に対して共通の影響は列が奇数長+奇数長や奇数長+偶数長に分割された際消失します(例えば \((a \oplus X, b\oplus X, c\oplus X, d\oplus X)\) を奇数長+奇数長に分けるとき、結果は \(X\) に依存していません)。このことに着目して操作を言い換えます。

まず偶数長の列を偶数長+偶数長に分割した場合について考えます。このとき互いに与えた影響が消失するかについてですが、最終的に長さ \(1\) (奇数)まで分割することを考えると、操作過程で必ず奇数長+奇数長に分割されるタイミングがあります。よって最初の偶数長+偶数長の分割による影響は必ず消失するので、偶数長+偶数長の分割は単なる列の分割と考えることができます。

つぎに偶数長の列を奇数長+奇数長に分割する場合について考えます。奇数長の列は分割する際、必ず奇数長の列が生じるため、最後まで奇数長の列に属し続けた要素が \(2\) つ存在することになります。奇数長から切り出されるのは偶数長であるため、この要素に与えられた影響(すなわち、元の列の総 \(\mathrm{XOR}\))は消失せずに残ります。この \(2\) つ以外については奇数長から奇数長+偶数長に分かれ出ているため影響は消失しており、やはり単なる列の分割と考えることができます。

以上をまとめると \(N\) が偶数の場合、操作は偶数長の数列のみに行うものとして、以下の2種類を行うと言い換えられます。

  • 列を偶数長の列 \(2\) つにわける
  • \(l \leq i < j \leq r\) を満たし、 \(i-l, r-j\) が偶数であるような整数 \(i,j\) を選ぶ。 \(A_i,A_j\)\(A_l \oplus A_{l+1} \oplus \dots \oplus A_r\) で置き換える。そして残った部分を\(3\) つの列に分割する

この操作後の \(A\) の総和の最小値は区間dpで \(O(N^3)\) 時間で計算できます( \(2\) 種類目の操作を素直に考えると \(\Theta (N^4)\) 時間かかりますが、例えば現在いくつ代入したか \((=0,1,2)\) をキーに持てばいいです)。

\(N\) が奇数の場合は \(A_1 \oplus A_2 \oplus \dots A_N\) が代入される個所を全探索すればいいです。

投稿日時:
最終更新: