文章

  • 首尾补充数组的技巧

    技巧:对一个 1-indexed 数组 \( r[1:n] \) ,将其扩容 \( 2 \) (变更为 0-indexed) ,并定义 \(r_0 \) 和 \( r_{n+1} \)。

    把这个数组进行分块,可以考虑此技巧。设存在有序二元组集 \[ P=\{ <a_1,b_1>,<a_2,b_2>, \cdots, <a_n,b_n> \} \],其中 \( a_i,b_i \)代表区间 \( [a_i,b_i] \),且 \( \forall 1 \le i \lt n, a_{i+1}=b_{i} \)。为将 \(r\) 按上述区间分块,将 \( r \) 扩容 \( 2 \) ,改为以 \( 0 \) 为起始索引,并为 \( r[0] \) 和 \( r[n+1] \) 赋 合适的值,从而对满足 \( r[i] \neq r[i+1], \space i \in [0,n] \) 的所有 \(i \),将 \( r_{i} \) 和 \( r_{i+1} \) 划入不同块。此后按 \(i\) 即可对所得 \[ \forall 0 \le i \le n, [a_i,b_i] \] 的所有块执行所需操作。

    此外,补全数组首尾可以消除 \( \phi_1,\phi_3 \) 将局部条件

    \[ \Phi(i)=\begin{cases} \phi_1(a_{i},a_{i+1}) & i=1 \\ \phi_2(a_{i-1},a_{i},a_{i+1}) & 1 \lt i \lt n \\ \phi_3(a_{i-1},a_i) & i=n \end{cases} \tag 1 \]

    合并为

    \[ \begin{align} \Phi(i)’ & = \phi(a_{i-1},a_{i},a_{i+1}) & 1 \le i \le n \end{align} \tag 2 \]

    从而简化判断。

    题目:小红的最佳区间Flip The Bit (Hard Version)