ABC463 D - Maximize the Gap

すき間の最大化

考え方

「あるスコア $x$ 以上が達成できるか?」は $x$ について単調である。
よって、この疑問の結果を $x$ で二分探索していけば、$O(\log (R_{\max}-L_{\min}))$ 回の判定で答えられる。

あとは、$1$ 回の判定をどうやるかだが、これはほぼ区間スケジューリング問題そのものである。
許される次のスタート位置を $x$ 離さなければならないことくらいしか違いがない。
よって、事前にソートをしておけば $1$ 回の判定は $O(N)$ で可能。

これで、全体として $O(N \log N + N \log (R_{\max}-L_{\min}))$ で解ける。

最後に、不可能な場合の答えを $-1$ に書き換えるのを忘れずに。
これは、二分探索の結果が $1$ 未満であるかどうかで判定できる。

入力例1での動作

入力を受け取る。

n: 6
k: 3
l: {1, 2, 5, 9, 10, 15}
r: {12, 7, 9, 13, 18, 20}

布を右端が小さい順に並べると、次の順になる。

[2, 7], [5, 9], [1, 12], [9, 13], [10, 18], [15, 20]

スコア $x$ を達成できるかを二分探索する。
判定では、右端の小さい順に布を見ていく。
最初の $1$ 枚は選び、それ以降は直前に選んだ布との距離が $x$ 以上なら選ぶ。

二分探索中の判定は次のようになる。

$x$ 貪欲に選ばれる布 選べる枚数 $3$ 枚選べるか
$9$ $[2,7]$ $1$ できない
$4$ $[2,7],[15,20]$ $2$ できない
$2$ $[2,7],[9,13],[15,20]$ $3$ できる
$3$ $[2,7],[10,18]$ $2$ できない

したがって、達成できる最大のスコアは $2$ となる。

注意点

特になし。

別解

特になし。