ABC231G & ABC232G 题解


「ABC231G」Balls in Boxes(期望推式子 + DP)

题面

题意:

\(n\) 个盒子,每个盒子里一开始有 \(A_i\) 个球,你可以进行 \(K\) 次如下操作:

  • 随机选择一个盒子,往这个盒子里放入一个球。

\(B_i\) 为第 \(i\) 个盒子里最终有的球的数量,权值\(\prod\limits_{i=1}^n B_i\),求期望权值大小。

数据范围:\(1\le n\le10^3\)\(1\le K\le 10^9\)\(0\le A_i\le10^9\)

\(B_i\) 拆成 \(A_i+X_i\),其中 \(X_i\) 是第 \(i\) 个盒子里被选中的次数。这样做的好处是把每个 \(A_i\)\(X_i\) 拆出来了,利用了 \(X_i\) 独立的性质。

\[\begin{aligned} &E[\prod\limits_{i=1}^n(A_i+X_i)]\\ =&\sum\limits_{i=1}^n S_{n,i}(A_1,A_2,\dots,A_n)E(\prod\limits_{j=1}^{n-i}X_j) \end{aligned} \]

其中 \(S_{n,i}(A_1,A_2,\dots,A_n)\) 为在 \(A_1,A_2,\dots,A_n\) 中选出 \(i\) 个数的乘积的和。

对于前后两部分分开算:

  • 前一部分可以直接 DP:设 \(f_{i,j}\) 为前 \(i\) 个数选了 \(j\) 个的乘积的和,则 \(f_{i,j}=f_{i-1,j}+f_{i-1,j-1}\times A_i\)

  • 后一部分继续拆式子,设 \(X_{i,j}\) 为第 \(j\) 轮是否选中 \(i\)

    \[\begin{aligned} &E(\prod\limits_{i=1}^m X_i)\\ =&E[\prod\limits_{i=1}^m(\sum\limits_{j=1}^K X_{i,j})]\\ =&\sum\limits_{j_1,j_2,\dots,j_n}E(\prod\limits_{i=1}^m X_{i,j_i}) \end{aligned} \]

    容易发现在 \(j_i\)\(j_o\) 相同的时候 \(X_{i,j_i}\not= X_{o,j_o}\),即它们两个中一定有一个 \(0\),这个时候 \(E(\prod\limits_{i=1}^m X_{i,j_i})\)\(0\),否则 \(E(\prod\limits_{i=1}^m X_{i,j_i})\) 就等于 \((\frac{1}{n})^m\)。因为每一个 \(j_i\) 之间有顺序关系,那么这一个式子就为 \(\prod\limits_{i=1}^{m}(K-i+1)(\frac{1}{n})^m\)。可以递推计算。

将两部分式子拼起来就是答案。

Code:https://atcoder.jp/contests/abc231/submissions/29979297。

「ABC232G」Modulo Shortest Path(优化建图 + 最短路)

题面

题意:

有一张 \(n\) 个点的有向完全图,每个点有两个属性 \(A_i\)\(B_i\),点 \(i\) 向点 \(j\) 连的边边权为 \((A_i+B_j)\mod M\)。问图中 \(1\)\(n\) 的最短路。

数据范围:\(2\le n\le2\times10^5\)\(2\le M\le10^9\)\(0\le A_i,B_i

直接把图建出来肯定是不现实的,于是考虑怎么优化连边。

建两层点分别为 \(1\sim n\)\(n+1\sim 2n\),大概可以理解为入点和出点。

\(B\) 数组排序,设排序后 \(B\) 数组的第 \(i\) 项原本是 \(c_i\),那么 \(\forall 1\le i,连边 \((c_i+n,c_{i+1}+n,B_{i+1}-B_i)\)。然后对于每一个 \(i\),在排序后的 \(B\) 中找到大于等于 \(M-A_i\) 最小的 \(B\) 的位置(设为 \(j\)),那么连边 \((i,c_j+n,A_i+B_j-M)\),这样之后的点就肯定会优先走这条边(因为之前的边肯定不优)。最后连边 \((i+n,i,0)\),表示走回去。

跑一遍 Dijkstra 即可。

Code:https://atcoder.jp/contests/abc232/submissions/29948754。