Official

F - Random Update Query Editorial by leaf1415


まだ操作を一度も行っていない初期状態での各 \(A_i\) の期待値 \(E_i\) は、明らかに、入力で与えられた \(A_i\) の値そのものです。 その後操作を行うに伴って、その時点までにおける各 \(A_i\) の期待値 \(E_i\) は変化していきます。

具体的には、\(i\) 回目の操作では、対象区間 \([L_i, R_i]\) のある一つの要素 \(A_p\) に注目したとき、その値は \(\frac{1}{\lambda_i}\) の確率で \(X_i\) に変更され、\(\frac{\lambda_i-1}{\lambda_i}\) の確率でそのままです(ただし、\(\lambda_i \coloneqq R_i - L_i + 1\) )。 これによって、区間内の各要素 \(A_p\) について操作後の期待値 \(E' _p\) は操作前の期待値 \(E_p\) から \(E'_p = \frac{\lambda_i-1}{\lambda_i}x + \frac{1}{\lambda_i}E_p\) へと変化します。

したがって本問題を解くには、\(E = (E_1, E_2, \ldots, E_N)\) を、各 \(E_i\) を入力で与えられた \(A_i\) で初期化した状態から始め、 \(i = 1, 2, \ldots, M\) の順に下記の操作を行い、その結果得られた \(E\) を出力すれば良いです。

\(E\) の区間 \([L_i, R_i]\) の各要素について、 その値 \(x\)\(\frac{\lambda_i-1}{\lambda_i}x + \frac{1}{\lambda_i}X_i\) に置き換える。

これは遅延伝搬セグメント木(AtCoder Library では lazy_segtree)を用いることで高速に実現可能です。

posted:
last update: