2021年2月20日土曜日

CodeChef - Little Elephant and Movies

制約を見て三乗想定かと思ったら二乗想定だった。

O(N2K){O}(N^2K)

P1P2...PNP_1 \le P_2 \le ... \le P_Nと仮定してよい。また、f(i):=f(i) := 映画iiと同じpriorityを持つ映画の中でもっとも右にあるものの位置、とする。P0=0P_0 = 0としておくと都合がよい。

dp[x][y][z]=x\operatorname{dp}[x][y][z] = x本映画を見た時点で、今までに見た映画で最もpriorityの高い映画の位置(タイは最初に見たものを優先)がyyで、現在のexcitingnessがzであるような場合の数

でDPできる。

遷移について。x<f(y)x < f(y)ならexcitingでない映画がf(y)xf(y)-x個あって

dp[x+1][y][z]+=(f(y)x)dp[x][y][z] \operatorname{dp}[x+1][y][z] \mathrel{{+}{=}} (f(y)-x)\operatorname{dp}[x][y][z]

excitingな映画y=f(y)+1,f(y)+2,...,Ny' = f(y)+1, f(y)+2, ..., Nについては

dp[x+1][y][z+1]+=dp[x][y][z] \operatorname{dp}[x+1][y'][z+1] \mathrel{{+}{=}} \operatorname{dp}[x][y][z]

素朴にやるとO(N3K){O}(N^3K)だが、累積和を取りながら遷移してO(N2K){O}(N^2K)(Pi)(P_i)のsuffixがタイになっている場合に、最後にそれらを全部足す必要があることに注意。

O(NK){O}(NK)

Editorialを見たらO(NK){O}(NK)想定だった。同じpriorityの映画をまとめて、降順に挿入していけばよい。(リンク先参照)

Myers, Wilf. Left-to-right maxima in words and multiset permutations

discussionに載っていた論文。この問題とわずかに違って同じpriorityの映画は区別できない設定だが、考え方は同じで、区別できるようにするには各priorityの頻度の階乗を掛けるだけ。

よく考えるとこれはDEGwerさんの数え上げPDF(3.探索順の変更)に載っている典型とほぼ同じだった。