盒子
盒子

bzoj 4245 [ONTAK2015]OR-XOR

给定一个长度为 $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}$ 的值最小

逐位贪心

支持一下
扫一扫,支持nekko
  • 微信扫一扫