解法
区間スケジューリングのように、区間の終わりの部分に注目すると、LISに帰着させることができます。
まず、中心座標はx軸上に存在しているので、それぞれの円について、中心座標と
がわかっているとき、円と軸が接する2点は、
と
になります。
すると、このから
を、一つの区間としてみることができます。
番目の円
に対する
を
、
を
とします。
あるサイズのターゲットが存在するとき、もう一つサイズを増やすには、
今あるターゲットの中で最大の円と、新しく加わる円
が次のような関係になっている必要があります。
かつ
図で表すとこのような状態です。

さて、ここで区間スケジューリングのように、区間の終わり、つまり側に注目すると、
を降順でソートすることで、円をいくつか選び、その円でサイズ
のターゲットが作成できたとき、
個を大きさ順に並べると、上のソートした順番と同じになります。
ので、について降順でソートしておけば、あとは
についてのみ考慮すれば、前から順番に円を選んでいくだけでターゲットが作成できるということです。
としたいのですが、コーナーケースが存在します。となるようなケースになります。このような場合は、
について昇順になっていると、
と
のみでターゲットのサイズを増やせるかどうかの判定ができないので、降順にならべておけばよいです。
ここで、LISを思い出すことができれば、
サイズ
のターゲットを作成できるとき、その中で最小の円
についての
の最小値
とすると、この問題を解くことができます。
円を合わせてサイズ
のターゲットを作成するときに必要な条件が、
であるので、
はできるだけ小さくしておきたいからです。
の中の要素は昇順に並んでいますので、
について見ているとき、
のlower_boundを探しその部分を更新していき、なければ今最大の
に1追加した場所、つまり
に
を格納する、という操作を行えばよいです。これを
回繰り返すと、値が格納されている
のうち最大の値が答えになります。