mini notes

競技プログラミングの解法メモを残していきます。

第二回 アルゴリズム実技検定 L - 辞書順最小

問題:L - Lexicographically Minimum

解答:Submission #12939716 - 第二回 アルゴリズム実技検定

解法:後ろからぎりぎり作ることを考える。最後の1つはa[n-1]で作ればよい。その前はa[n-1-d]までで作る必要がある(そうでないと間隔がdとれない)。その前はa[n-1-2*d]までで作る必要がある。よって、それぞれの項で使用できるインデックスの上限が決まっている。インデックスの下限は前回使ったインデックス+d。

愚直にやると、この下限と上限の間の探索をK回繰り返せばよいが、それだとTLE。一度調べた項を調べないようにするためには、優先度付きキューを使い、(a[i], i)をペアにして管理する。なお、同じ値の項が複数ある場合は、前の項から使用する方が有利。

手順としては下記の通り。これで配列の探索がO(N)、優先度付きキューからの数値取得がO(KlogN)となり間に合う。

  1. 前回の上限+1から今回の上限までの配列の項を優先度付きキューに格納
  2. 「前回使ったインデックス + d 」以上のインデックスである最小の配列の項を優先度付きキューから取得