CF2131F 解题报告
分析
参考了官方题解。
首先你会发现:如果我们此时在 \((i,j)\),则有 \(a_i \otimes b_i=0\),如果我们想移动到 \((i+1,j)\),那么有:
\[\begin{aligned}
a_{i+1} \otimes b_i &=0\\
(a_i \otimes b_i) \otimes (a_{i+1} \otimes b_i) &=0\\
a_i \otimes a_{i+1}&=0\\
a_i &=a_{i+1}
\end{aligned}
\]
嗯,很(不)显然。
同理有从 \((i,j)\) 移动到 \((i,j+1)\) 时有 \(b_j=b_{j+1}\)。
总结一下就是:从 \((1,1)\) 移动到 \((x,y)\) 时有 \(a_1=a_2=a_3=\cdots=a_x=b_1=b_2=\cdots=b_y\)。
那么有 \(f(x,y)=\min(cnt_0(x,y),cnt_1(x,y))\)。
接下来是一步神奇的转化:
\[\begin{aligned}
f(x,y)&=\min(cnt_0(x,y),cnt_1(x,y))\\
&=\frac{cnt_0(x,y)+cnt_1(x,y)}{2}-\frac{|cnt_0(x,y)-cnt_1(x,y)|}{2}\\
&=\frac{x+y}{2}-\frac{|cnt_0(x,y)-cnt_1(x,y)|}{2}
\end{aligned}
\]
然后因为 \(\large \sum \limits_{x,y\in[1,n]} \frac{x+y}{2}=\frac{n^2\times(n+1)}{2}\),所以我们只需要统计 \(\large \frac{|cnt_0(x,y)-cnt_1(x,y)|}{2}\) 就好了。
维护绝对值时,我们只关心两个数的大小关系。在对面的数组中,每有一个比自己小的值就加一次自己的值,每有一个比自己大的值就减一次自己的值;另一个数组也可以同样处理。至于相等的情况,在一个数组中改为小于等于,在另一个数组中改为大于等于即可。这可以通过排序后双指针处理。