Codeforces 2103 F. Maximize Nor

题目大意:

定义 \(nor(x,y)\) 表示 \(x\) 或上 \(y\) 之后取反的结果。
定义 \(NOR(a_{1}, a_{2}, \dots a_{n}) = nor(NOR(a_{1}, a_{2} \dots a_{n - 1}), a_{n})\)
给定长度为 \(n\),值域在 \(0 \sim 2^k - 1\) 的序列 \(a\),对于每个 \(1 \le i \le n\),求:

\[\max_{l \le i, i \le r} NOR(a_{l}, a_{l + 1}, \dots a_{r}) \]

\(n \le 2 \times 10^5, 1 \le k \le 17, a_{i} ] < 2^k\)

解题思路:

\(NOR\) 操作没有任何好的性质,既没有结合律,也没有交换律。

所以各种数据结构一个都上不了。

只能去将 \(NOR\) 换一种形式了。
套路的,按照每一位分别考虑,现在相当于一个 0/1 序列。
根据 \(NOR\) 的定义,我们在最后一个 1 的位置操作后一定为 0。
然后后面每次遇到一个 0,就相当于异或一个 1,也就只关心与右端点的奇偶性。
但当最后一个出现 1 的位置是左端点的时候与上面是相反的。

也就是我们对于每一位最后一次出现的位置只关心:

  1. 是否左端点。
  2. 与右端点的奇偶性相不相同。
    那么从前往后枚举右端点,然后如果某一位的最后一次出现的位置为左端点,就得将所有 \(lst_{r,j}\),就是 \(r\) 前面第 \(j\) 位最后一次出现次数都枚举一遍。

其他的情况钦定不能是某个 \(lst\),但又由于与 \(i\) 的奇偶性有关,所以还得维护那些不是 \(lst\) 的位置,每两个相邻的 \(lst\) 直接要选一奇一偶。
贪心地选就是选最左边地奇偶的位置。

至于更新答案,可以用倍增上打懒标记来实现。
\(O(n \times k \times \log n)\)

\[ 总结; 很多新定义的东西都是不满足结合律/交换律的,所以要刻画成一些好维护的形式,看一下他的值与什么有关是很重要的。 \]

posted @ 2025-04-30 23:04  positive_deviation  阅读(55)  评论(0)    收藏  举报