[ARC164D]1D Coulomb 题解

[ARC164D]1D Coulomb 题解

题意

在长为 2N 的数轴上放有 2N 个小球,第 i 个小球在坐标 i 的位置。 2N 个小球中有 N 个小球带正电,有 N 个小球带负点。记第 i 个小球带 ai 单位电荷(ai{1,1}),小球之间受到力的作用,第 i 个小球受到的力的大小 Fi=(j=1i1ajj=i+12Naj)×ai。小球会进行运动,运动规则如下:

  1. Fi>0 时第 i 个小球以每单位时间 1 单位长度的速度匀速向右运动。
  2. Fi<0 时第 i 个小球以每单位时间 1 单位长度的速度匀速向左运动。
  3. i 号球和 j 号球在某一时刻出现在同一位置并且 aiaji 号球和 j 号球同时消失,记第 i 个球在坐标 xi 处消失。

分析可知不会有三个小球同时出现在同一个位置,并且最终所有小球均会消失。

现在给出一个长为 2N 的字符串,当第 i 个字符为 + 时表示 ai=1,第 i 个字符为 -ai=1,第 i 个字符为 ? 时表示 ai 不确定。对于所有合法的可能的小球的电性情况求出 i=12N|ixi| 的值的和,答案对 998244353 取模。

N3000

题解

先考虑没有问号时如何统计答案:

由于两个小球 i,j 当且仅当在 ai+aj=0 时相撞才会消失,所以小球的消失对于其他小球受力的大小无影响,也就是说小球运动的方向在消失之前不变。

进一步分析可以发现,小球之间的相撞消失类似于括号匹配,例如:

++----+-+-++

这个序列可以分成两段恰好电荷和为 0 的子段:

++--,--+-+-++

对于第一段我们将 +,- 分别视作 (,)。对于第二段我们将 +,- 分别视作 ),(。然后就可以匹配了,具体地:14,23,512,67,89,1011 分别进行匹配。

形式化地来说:我们首先将整个序列划分成若干个不相交的极小的电荷和为 0 的子段,然后对于每一个子段 slr,将 sl 这种字符视为 (,另一种字符(即 sr 这种字符)视为 ),然后进行括号匹配,匹配上的两个小球相撞消失。那么答案就是所有配对的小球的坐标差的和。

分析完了相撞的性质,考虑怎样统计答案更方便。直接统计不好做。所以套路的改变求和方式,我们考虑 [i,i+1] 这个单位长度被多少对配对的小球经过,记为 fi。换句话说 fi 就是前 i 个球与后 ni 个球配对的对数,观察可以发现:

fi=|i=1iai|

那么答案就是 i=12N1|j=1iai|

以上是对于没有 ? 的情况的答案的计算,下面说一下有 ? 了怎么做。

我们设 gi,j 表示 k=1iak=j 的方案数,那么答案就是:

i=12N1j=NNgi,j×|j|

gi,j 可以组合数计算,具体地:

当前 i 个字符中有 x+y-z?。整个字符串中有 X+Y-Z?,那么就有:

gi,(x+k)(y+zk)=(zk)(ZNXk)

其中 k 是枚举 z? 中有 k? 电荷量为正。

本题到这里就结束了,复杂度 O(n2)代码很短

posted @   _zyc  阅读(17)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示