Description
给你一个长为\(n\)的自然数序列\(a_i\),将其分为恰好\(m\)段,设第\(i\)段异或和为\(c_i\),请最小化\(c_1\lor c_2\lor\ldots\lor c_m\)。
\(1\leq n\leq 500000, a_i\leq 10^{18}\)。
Solution
考虑求\(a_i\)的异或前缀和\(b_i\),那么每一段的异或和就可以用两个\(b_i\)异或起来的结果来表示。
因为是要求答案最小,那么我们就从高位往低位考虑,尽可能让高位不要填\(1\)。考虑某一位如果不能是\(1\),并且你的第一段为\(1\ldots p\)的话,那么\(b_p\)在这一位必不为\(1\),根据异或的结果可以知道下一个剖分点的\(b_i\)的这一位也不是\(1\)……最终\(b_n\)的这一位也不是\(1\)。换言之存在\(m\)个位置在这一位不为\(1\),并且\(b_n\)在这一位也不是\(1\)。
最后要注意的一点是如果有一个剖分点在这一位是\(1\)的话,那么之后的位不能使用该剖分点,否则就错力。
Code
1 |
|