2020年5月2日土曜日

第二回 アルゴリズム実技検定

リアルタイム受験した。4時間40分かけて全完。前回に比べるとかなり苦戦した。

F

別解っぽいの:

BiB_iの降順に埋められるできるだけ早い日を埋めていく貪欲が成立する。(交換しても損しないことに注目すればよい。) このとき、next[i]:=\operatorname{next}[i] := ii日目以降(inclusive)でまだ埋めていない最も早い日、として空きを管理する。next\operatorname{next}を辿る際にpath compressionするとたぶんO(NlogN){O}(N\log N)

K

(を見るとネストの深さが+1され、)を見ると深さが-1されると考えると、文字を削除(=無視)するのは深さを変えないで次に進むことと解釈できる。したがって、次のようなDPが可能である:

dp[x][y]:=\operatorname{dp}[x][y] := 1,...,x1, ..., x文字目まで見て、深さがyyの場合の最小コスト

答えはdp[N][0]\operatorname{dp}[N][0]に等しい。O(N2){O}(N^2)

L

KK個の要素を選ぶ際、先頭からxx番目(0-based)の数の元のインデックスii(0-based)はi<ND(Kx1)i < N-D(K-x-1)を満たす必要があり、その中で最小(タイブレークはもっとも左)の数を選べばよい。優先度付きキューでできる。

M

今回いちばん大変だった問題で、最後にACした。

数列(Ci)(C_i)をいくつかつなげたものを走査して、各食事xxについての情報を累積していく。具体的には、table[x]\operatorname{table}[x]に(日付, この日付までに食べた料理xxの数, この日付までに食べたxx以外の料理の数)の日付に関する昇順配列を作って、料理xxが出るたびに情報を追加していった。こうすると、ある日付から一巡したときに食べる好みの料理の数と好みでない料理の数は二分探索でわかるので、何周するか計算すればよい。ただし、端の処理をするのがかなりつらかった……

N

平面走査する。xx座標を圧縮しておいてyy座標に関して走査した。

O

問題の条件を無視して最小全域木TTを得たとする。TTTT外の任意の辺e:=(u,v)e := (u, v)を追加すると閉路ができるが、この閉路上でもっとも重みの大きな(ee以外の)辺を除けば求める最小全域木TeT_eが得られる。(正当性は最適性条件により明らか……と言いたいところだが、そんなに簡単な証明を思いつかなかった。下に書いた。)この「辺の重みの最大値」はTT上のパスuvu - vに関するmax\maxクエリを処理すれば得られる。

やることはわかったのだが、そもそも木上のパスクエリを処理した経験があまりない。単純なオイラーツアーではmin/maxの処理ができないように見えるし、HL分解やLC木は持っていないし、Mo's algorithmではO(1){O}(1)の遷移が思いつかないし、しばらく困っていた。HL分解を調べて書こうと決めたところで、そもそも更新がないのでLCAのbinary liftingがそのままmin/maxクエリにも使えることに気づいた。やっぱり経験がないとこういうことがぱっとわからないな。

証明: eeのコストをwwとし、このコストを00に変えたグラフをG0G_0とする。また、G0G_0のMST T0T_0が与えられたとして、そのコストの総和をW0W_0とする。(path optimality conditionより)T0T_0eeを必ず含むので、T0T_0GG上でコストW0+wW_0 + wの全域木になっている。GGeeを含む全域木 TT'でこれより総コストの低いものが存在すると仮定して、総コストをW(<W0+w)W'(< W_0 + w)とする。TT'G0G_0の全域木でもあり、コストの総和はWwW'-wだが、Ww<W0+ww=W0W'-w < W_0 + w -w = W_0なので、T0T_0がMSTであるという仮定に反する。したがって、求める全域木はG0G_0のMSTであることがわかった。

あとは、上の作り方でできた全域木TeT_eG0G_0上でMSTであることを示せばよい。TeT_e外の任意の辺ee'を追加すると閉路ができるが、この閉路に含まれるee以外の辺は(TTGGにおけるpath optimality conditionより)ee'以下の重みを持つし、ee自身は重み00なので、やはりee'以下の重みを持つ。したがって、TeT_eG0G_0上でpath optimality conditionを満たす。\square

後半は有名事実だと思うけど若干雑…… 書き直すかも