[ARC164D]1D Coulomb 题解
[ARC164D]1D Coulomb 题解
题意
在长为 \(2N\) 的数轴上放有 \(2N\) 个小球,第 \(i\) 个小球在坐标 \(i\) 的位置。 \(2N\) 个小球中有 \(N\) 个小球带正电,有 \(N\) 个小球带负点。记第 \(i\) 个小球带 \(a_i\) 单位电荷(\(a_i\in\{1,-1\}\)),小球之间受到力的作用,第 \(i\) 个小球受到的力的大小 \(F_i=(\sum_{j=1}^{i-1}a_j-\sum_{j=i+1}^{2N}a_j)\times a_i\)。小球会进行运动,运动规则如下:
- 当 \(F_i>0\) 时第 \(i\) 个小球以每单位时间 \(1\) 单位长度的速度匀速向右运动。
- 当 \(F_i<0\) 时第 \(i\) 个小球以每单位时间 \(1\) 单位长度的速度匀速向左运动。
- 当 \(i\) 号球和 \(j\) 号球在某一时刻出现在同一位置并且 \(a_i\not=a_j\) 时 \(i\) 号球和 \(j\) 号球同时消失,记第 \(i\) 个球在坐标 \(x_i\) 处消失。
分析可知不会有三个小球同时出现在同一个位置,并且最终所有小球均会消失。
现在给出一个长为 \(2N\) 的字符串,当第 \(i\) 个字符为 \(\texttt{+}\) 时表示 \(a_i=1\),第 \(i\) 个字符为 \(\texttt{-}\) 时 \(a_i=-1\),第 \(i\) 个字符为 \(\texttt{?}\) 时表示 \(a_i\) 不确定。对于所有合法的可能的小球的电性情况求出 \(\sum_{i=1}^{2N}\left |i-x_i\right |\) 的值的和,答案对 \(998244353\) 取模。
\(N\le 3000\)。
题解
先考虑没有问号时如何统计答案:
由于两个小球 \(i,j\) 当且仅当在 \(a_i+a_j=0\) 时相撞才会消失,所以小球的消失对于其他小球受力的大小无影响,也就是说小球运动的方向在消失之前不变。
进一步分析可以发现,小球之间的相撞消失类似于括号匹配,例如:
++----+-+-++
这个序列可以分成两段恰好电荷和为 \(0\) 的子段:
++--,--+-+-++
对于第一段我们将 \(\texttt{+},\texttt{-}\) 分别视作 \(\texttt{(},\texttt{)}\)。对于第二段我们将 \(\texttt{+},\texttt{-}\) 分别视作 \(\texttt{)},\texttt{(}\)。然后就可以匹配了,具体地:\(1-4,2-3,5-12,6-7,8-9,10-11\) 分别进行匹配。
形式化地来说:我们首先将整个序列划分成若干个不相交的极小的电荷和为 \(0\) 的子段,然后对于每一个子段 \(s_{l\cdots r}\),将 \(s_l\) 这种字符视为 \(\texttt{(}\),另一种字符(即 \(s_r\) 这种字符)视为 \(\texttt{)}\),然后进行括号匹配,匹配上的两个小球相撞消失。那么答案就是所有配对的小球的坐标差的和。
分析完了相撞的性质,考虑怎样统计答案更方便。直接统计不好做。所以套路的改变求和方式,我们考虑 \([i,i+1]\) 这个单位长度被多少对配对的小球经过,记为 \(f_i\)。换句话说 \(f_i\) 就是前 \(i\) 个球与后 \(n-i\) 个球配对的对数,观察可以发现:
那么答案就是 \(\sum_{i=1}^{2N-1}\left|\sum_{j=1}^{i}a_i\right|\)。
以上是对于没有 \(\texttt{?}\) 的情况的答案的计算,下面说一下有 \(\texttt{?}\) 了怎么做。
我们设 \(g_{i,j}\) 表示 \(\sum_{k=1}^{i}a_k=j\) 的方案数,那么答案就是:
而 \(g_{i,j}\) 可以组合数计算,具体地:
当前 \(i\) 个字符中有 \(x\) 个 \(\texttt{+}\),\(y\) 个 \(\texttt{-}\),\(z\) 个 \(\texttt{?}\)。整个字符串中有 \(X\) 个 \(\texttt{+}\),\(Y\) 个 \(\texttt{-}\),\(Z\) 个 \(\texttt{?}\),那么就有:
其中 \(k\) 是枚举 \(z\) 个 \(\texttt{?}\) 中有 \(k\) 个 \(\texttt{?}\) 电荷量为正。
本题到这里就结束了,复杂度 \(\mathcal{O}(n^2)\),代码很短。