目次

AtCoder Regular Contest 174 C,E 問題メモ

AtCoder Regular Contest 174

速解き回のようで速解き回でない、少し速解き回のARC

C - Catastrophic Roulette

C - Catastrophic Roulette

問題

解法

まだ出てない目が $i$ 個で自分に手番が回ってきたときの、ここからの自分の罰金期待値 $P_i$、相手の罰金期待値 $Q_i$ とする。

最終局面は $P_0=0,Q_0=0$ である。

$i-1$ と $i$ の関係は以下のような式になる。

まとめると、

ここから、$Q_i$ を消すと、$P_i$ を $P_{i-1},Q_{i-1}$ だけで計算できる式になる。それをもって $Q_i$ も計算できる。

$i$ が小さい方から求めていって、$P_N,Q_N$ が答え。

Python3

E - Existence Counting

E - Existence Counting

問題

解法

$P$ と先頭から比較してはじめて異なる値が出てくる位置を $d$ とする。
桁DPのように、$d$ ごとに分けて考えれば重複を除け、また $P$ より小さい条件を表しやすい。
$d$ には必ず $P_d$ より小さい値が置かれ、その後に置ける数は自由となる。

$t$ を固定すると、条件を満たす数列は以下の3つの場合がある。
$t$ が $P$ 中に出てくる位置を $u$ とする。$t$ が $P$ 中に出てこない場合、便宜的に $u=K$ とする。

N=18 K=13  t=10 の例
                      u
 i  0  1  2  3  4  5  6  7  8  9 10 11 12
 P  5 13 11  2 18  1 10 15 17  4 12  7  3

①  5 13 11  2 10  x  x  x  x  x  x  x  x
    5 10  x  x  x  x  x  x  x  x  x  x  x    など(xは任意)

②  5  9  x  x  x  x  x  x 10  x  x  x  x
    5 13 11  2 18  1  4  x  x  x 10  x  x    など    

③  5 13 11  2 18  1 10 15  6  x  x  x  x
    5 13 11  2 18  1 10 15 17  4 12  3  x    など

①の個数

上記の例で、$d=4$ として18を10にした場合、その後に置ける箇所は $K-d-1=8$ 個、残る数字は $N-d-1=13$ 個ある。

よって、${}_{13}P_{8}$ 通りある。

このように、10より左で10より大きい箇所は、$d=1,2,4 \ (P_d=13,11,18)$ とあるので、合計すると以下の個数分ある。

一般化すると、$t$ より左で、$t$ より大きい値が出現するindexの集合を $S_t$ として、①に該当する数列は以下の個数存在する。

②の個数

上記の例で、$d=1$ として、そこを $P_1=13$ より小さい何らかの値に変更したとする。

その後に置ける箇所は $K-d-1=11$ 個、残る数字は $N-d-1=16$ 個ある。
この中の1つが $t$ である数列の個数を数える。

$t$ を置く場所は11通り、他の箇所の決め方が ${}_{15}P_{10}$ 通り。
よって、$d=1$ の箇所に置く数を1つ決めた場合、以降に10が出てくる数列は、$11 \times {}_{15}P_{10}$ 通りある。

一般化すると、以下のようになる。(ただし、$K-d-2$ が負になる場合は $0$)

$d$ の箇所に置ける数の個数分だけ、これが倍加される。

いま、$L_i$ を「$P_i$ 未満の数のうち、$i$ より左に出てこない数の個数」と定義する。
たとえば、$L_6$ なら、1,2,5 は $P_6=10$ より小さくて左に出てくるので、それ以外の 6 個が該当する。

「$d$ の箇所に置ける数」は、基本的に $L_d$ 個である。ただし、$t$ 自身であってはならないので、$t$ と $P_d$ の大小関係によって変化する。

このように補正した値を $L'_d(t)$ とする。

②に該当する数列は、以下の個数分だけ存在する。

③の個数

$t$ が $P$ 中に出てくる場合のみに考慮される。

要は、先頭のいくつかが固定されて、残りが自由である数列の中で、$P$ は何番目ですか、という値となる。

$i-1$ までが固定されて、$i$ 以降が自由であるよい数列の中で $P$ 以下のものの個数を $R_i$ とする。

i=10, Pi=12 の場合
                                 i
i  0  1  2  3  4  5  6  7  8  9 10 11 12    ここまでが固定されて、
P  5 13 11  2 18  1 10 15 17  4 12  7  3    残り3箇所が自由なよい数列の内、
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~           ←P以下のものの個数は?

$i$ に12未満の数を置いて $P$ 未満であることを確定させるか、または12のままにするか。
$i$ に置ける数の個数は、先述の $L_i$ と一致する。その後に置く数は自由となる。
12のままにした場合、その個数は $R_{i+1}$ と一致する。

まとめると、以下のようになる。

末尾から求めていける。

③に該当する数列は、$t$ が $P$ 中に出現する場合、$R_{u+1}$ 個存在することになる。(出現しない場合は0)

まとめ

$t$ が小さい方から計算する。

①②は、$t$ によって加算される値が異なってくるが、

という性質があるため、Fenwick Tree で、$t$ が小さい方から答えを求めて $t$ の位置を更新していけば、管理できる。

t=1 のとき
i  0  1  2  3  4  5  6  7  8  9 10 11 12    ①: ①の場合の加算分
P  5 13 11  2 18  1 10 15 17  4 12  7  3    ②: ②の場合の加算分,係数 Li-1
  ① ① ① ① ①                            ❷: ②の場合の加算分,係数 Li
  ② ② ② ② ② ❷

t=2 のとき
i  0  1  2  3  4  5  6  7  8  9 10 11 12
P  5 13 11  2 18  1 10 15 17  4 12  7  3
  ① ① ①
  ② ② ② ❷

t=3 のとき
i  0  1  2  3  4  5  6  7  8  9 10 11 12
P  5 13 11  2 18  1 10 15 17  4 12  7  3
  ① ① ①    ①    ① ① ① ① ① ①
  ② ② ② ❷ ② ❷ ② ② ② ② ② ② ❷

t=4 のとき
i  0  1  2  3  4  5  6  7  8  9 10 11 12
P  5 13 11  2 18  1 10 15 17  4 12  7  3
  ① ① ①    ①    ① ① ①
  ② ② ② ❷ ② ❷ ② ② ② ❷

...

$t$ の答えを求める際は、$t$ の出現位置を $u$ として、まず自身の箇所を更新する。

($t$ が $P$ 中に出てこない場合、便宜的に $u=K$ とするが、更新は行わないでよい)

この上で、FenwickTree 上の $0,1,...,u$ の累積和が①+②の場合、$R_{u+1}$ が③の場合に相当する。

$O(N \log{N})$ で全ての $t$ に対して求められる。

Python3