给定一个长度为 $n$ 的序列 $a_1,a_2,\cdots,a_n$,请将它划分为 $m$ 段连续的区间,设第 $i$ 段的费用 $c_i$ 为该段内所有数字的异或和,则总费用为 $c_1 \text{ or } c_2 \text{ or } \cdots \text{ or } c_m$
请求出总费用的最小值,$1 \le 𝑚 \le 𝑛 \le 5 \cdot 10^{5},0 \le a_i \le 10^{18}$
很遗憾,贪心的做法有些问题……
比如说 $[1,1,1,1]$ 可以分为 $[1,1],[1,1]$ 或 $[1],[1,1],[1]$
先求前缀异或和,转化为 $s_1 \text{ or } (s_1 \oplus s_2) \text{ or } \cdots \text{ or }(s_{n-1} \text{ or } \oplus s_n)$
考虑到 $(A\Delta B)\cup B=(A-B) \cup (B-A) \cup B=(A-B)\cup B=A \cup B$
即 $(a \oplus b) \text{ or } b=a \text{ or } b$
原式化简为 $s_1 \text{ or } s_2 \text{ or } \cdots \text { or }s_n$
于是问题就转化为了把一个异或前缀和序列中选若干个元素,使得 $\text{or}$ 的值最小
逐位贪心