3匹の猫

みみねこの競プロ精進メモ

キーエンス プログラミング コンテスト 2021参加記(~C問題)

300-400(1)-500-0(1)-0-0で1ペナ3完1200点。

A - Two Sequences 2

全ての組を見るとO(N^2)かかりTLEする。
c_nを求めるには、a_n, b_nまでの要素を見ればよい。さらにc_nを求める際、数列bからb_nを選ぶか選ばないかで2通りに場合分けできる。

  • b_nを選ばない場合

このとき、i\le jという制約から、a_nも選ぶことができない。つまりどちらの数列からもn-1番目までの要素から選ぶことになり、この答えはc_{n-1}に一致する。

  • b_nを選ぶ場合

このとき、a_1からa_nまでの要素のどれを選んでもよい。正の数同士の乗算なので、貪欲に最大値を選ぶのが最適である。

まとめると、a_1からa_nまでの要素の最大値をa_{\max}とおいて、
c_n=\max(a_{\max}\times b_n, \ c_{n-1})
が答えとなる。一つ前の答えが必要なので前から順に計算していく。

計算量は、O(N)

B - Mex Boxes

数列aの中に、\{0, 1, 2, \dots , P\}があるときこれらをすべて使ってP+1点を得られる。この時、P+1aの中に含まれているなら、\{0, 1, 2, \dots , P, P+1\}とすることでP+2点得られる。一般に、P点得るにはP個の数が必要なので、最高でP点得ることが可能なら貪欲にP個の数を使ってP点得た方が良い。
あとは、数列aのなかにそれぞれの数が何個含まれているかをカウントし、数が大きい方から見て貪欲に作っていく。最高でK回までしか得点を得られないことに気を付ける(1WA)。

計算量は、O(N\log N)

C - Robot on Grid

全てのマスに文字が書き込まれているなら、O(HW)のDPで解くことができる。配るDPで書くと、
dp[i][j]:=(マス(i, j)に行く経路の数)
と定義して、マス(i, j)が右方向に進めるならdp[i][j+1]+=dp[i][j]とすればよい。下方向も同じくdp[i+1][j]+=dp[i][j]となる。最初のマス(1, 1)にいるロボットは1体なので、dp[1][1]=1である。

ここで、C=HW-Kとおく(何も書かれていないマスの数を表す)。マスへの書き込み方は3^C通りあるので、マス(1, 1)に3^C体のロボットをおいて、すべてのロボットが異なる動きをすると仮定して考える。このとき、何も書かれていないマスに到達したロボットのうち、\dfrac{1}{3}は「R」、\dfrac{1}{3}は「D」、\dfrac{1}{3}は「X」であり、右に進めるのはマスに「R」か「X」が書かれていた場合のみである。よって、動的計画法の遷移は
dp[i][j+1]+=dp[i][j] * 2 / 3
となる。下に進む場合も同様である。計算時は、常にMODを取って計算することを忘れないようにする。また、割り算のMODは逆元を用いて計算できる。

計算量は、O(HW)


感想

パァン!

👺< 実装が遅い!