Official

D - 1D Coulomb Editorial by riano_


正の電荷を持つ各ボールについて、それぞれ対となる負の電荷を持つボールまでの距離を求め、その総和を計算することを考えます。また、以下では正の電荷を持つボール、負の電荷を持つボールを単に正電荷、負電荷と呼びます。

数直線上の \(x=0.5, 1.5, \ldots , 2N+0.5\) の位置での左からの電荷の累積和の折れ線グラフを考え、またこの値を \(\mathrm{pot}(x)\) とします。例えば \(s=\) ++---+ では下の図のようになります。電荷の総和が \(0\) であることから、 \(F\) の式に現れる

\(-\) \((\) 自身より右の電荷の総和 \()\)

は「自身を含んで自身より左にある電荷の総和」に等しく、したがって、\(x=i\) にあるボールについて

\(F=(\mathrm{pot}(i-0.5)+\mathrm{pot}(i+0.5))\times(\) 自身の電荷 \()\)

です。結局、グラフ上で累積和が正の領域では正電荷は右、負電荷は左に動き、負の領域では逆であることが分かります(図上の矢印)。したがって、stack の要領で、\((\mathrm{pot}(i-0.5)+\mathrm{pot}(i+0.5))\) が同じである電荷どうしが対になります。

stack に正電荷を積み上げるとき、対になる電荷との距離への寄与を考えます。stack に \(k\) 個の正電荷が残っている状態で正電荷を積むと、

  • その電荷自身は最短で距離 \(1\) 離れた負電荷と対になる
  • \(k\) 個の既にあった電荷について、今積んだ正電荷、それと対になる負電荷の分だけ対になるべき電荷の位置が遠ざかるので、それぞれ \(2\) ずつ距離が増加する

ことから、距離の総和に対して \(2k+1\) の寄与があります。(正電荷が積まれた状態で)負電荷を置くと、一番上にある正電荷の対との距離が確定し、stack から取り除かれます。

したがって、その時点での正電荷(または負電荷)のもう片方に対する超過数が分かれば、その点に置いた電荷の寄与を計算できます。これは、例えばそれまでに配置した正電荷の数と負電荷の数を添え字とした DP で解くことができます。

posted:
last update: