ABC463D - 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}

各布について、「右端、左端」の形にして、右端が小さい順に並べる。

vec: {(7,2), (9,5), (12,1), (13,9), (18,10), (20,15)}

スコア $x$ を達成できるかを二分探索する。
達成できる値の下限 inside を $0$、達成できない値の上限 outside を $20-2 = 18$ で初期化する。

inside: 0
outside: 18

まず、$x=9$ を達成できるか確認する。
右端が最も小さい布 (7,2) を選ぶ。
次に選ぶ布は、左端が $7+9=16$ 以上である必要がある。

vec: {(7,2), (9,5), (12,1), (13,9), (18,10), (20,15)}
x: 9
border: 16
counter: 1

左端が $16$ 以上である布は残っていないので、$1$ 枚しか選べない。
$k=3$ 枚以上選べないので、$x=9$ は達成できない。
outside を $9$ に更新する。

inside: 0
outside: 9

次に、$x=4$ を達成できるか確認する。
右端が最も小さい布 (7,2) を選ぶ。
次に選ぶ布は、左端が $7+4=11$ 以上である必要がある。

vec: {(7,2), (9,5), (12,1), (13,9), (18,10), (20,15)}
x: 4
border: 11
counter: 1

(20,15) を選べる。
これで $2$ 枚選べたが、$k=3$ 枚に足りていないので、$x=4$ は達成できない。
outside を $4$ に更新する。

inside: 0
outside: 4

次に、$x=2$ を達成できるか確認する。
右端が最も小さい布 (7,2) を選ぶ。
次に選ぶ布は、左端が $7+2=9$ 以上である必要がある。

vec: {(7,2), (9,5), (12,1), (13,9), (18,10), (20,15)}
x: 2
border: 9
counter: 1

(13,9) を選べる。
次に選ぶ布は、左端が $13+2=15$ 以上である必要がある。

border: 15
counter: 2

(20,15) を選べる。
これで $3$ 枚選べたので、$x=2$ は達成できる。
inside を $2$ に更新する。

border: 22
counter: 3
inside: 2
outside: 4

次に、$x=3$ を達成できるか確認する。
右端が最も小さい布 (7,2) を選ぶ。
次に選ぶ布は、左端が $7+3=10$ 以上である必要がある。

vec: {(7,2), (9,5), (12,1), (13,9), (18,10), (20,15)}
x: 3
border: 10
counter: 1

(18,10) を選べる。
次に選ぶ布は、左端が $18+3=21$ 以上である必要がある。

border: 21
counter: 2

左端が $21$ 以上である布は残っていないので、$2$ 枚しか選べない。
$k=3$ 枚以上選べないので、$x=3$ は達成できない。

inside: 2
outside: 3

insideoutside の差が $1$ になったので、二分探索を終了する。
達成できる最大のスコアは $2$ である。

よって、2 を出力する。

注意点

特になし。

別解

特になし。