かしのブログ

競技プログラミングとか

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

問題

長さ Nの数列[A_1, \cdots, A__N]から K個の要素を選んで部分数列を作る。 要素を選ぶときは、要素ごとに D以上開ける必要がある。 辞書順で最小の数列を求める。

考察

 D(K-1) + 1 \gt Nのとき、部分列を作ることはできない。 以下、 D(K-1) + 1 \leq Nを仮定する。

同じ数字が複数あり、どちらも採用できるとき、なるべく先の方を採用した方がいい。

1文字目は、 A_1, \cdots A_{N-D(K-1)}から選ぶ必要があり、この中で最小の文字にするとよい。また、最小の文字が複数ある場合はもっとも先にある方を選ぶ。  k文字目の引数を i_kとすると、2以上の kについて、  k文字目は A_{i_{k-1}}, \cdots A_{N-D(K-k)}の最小の文字のうちもっとも先のものを貪欲に選べばよい。

区間で最小の文字はセグメント木を使って高速に求められる。

実装

atcoder.jp