TUATPC2024Summer (Algorithm)
コンテスト日時
2024/09/26 (Th) 20:00 - 23:00

L - Emotional View

Earlgray
4
s
1024
MB
350

問題文

無限に広がる二次元平面があります。

この二次元平面上には $N$ 個の「エモスポット」が存在し、$1, \dots, N$ の番号が付けられています。$i$ 番のエモスポットは点 $(x_i, y_i)$ を中心とする半径 $r_i$ の円 $C_i$ で表されます。なお、エモスポット同士は接することはありますが、共通部分が正の面積を持つことはありません。すなわち、任意の相異なる $i, j \ (1 \le i, j \le N)$ について、$C_i$ と $C_j$ は高々 $1$ つの交点しか持ちません。

Alice は二次元平面上の点 $(0, 0)$ に宿を建設しようと考えています。宿からはなるべく色んなエモスポットが見えると嬉しいので、Alice は点 $(0, 0)$ に宿を建設したときにどのエモスポットが宿から見ることができるかを知りたいです。

ここで、点 $(0, 0)$ から $i$ 番のエモスポットが見ることができるとは、他のどのエモスポットにもそのエモスポットの一部分あるいはすべてが隠されることがないことを指します。

より厳密には、次の条件を満たすことを指します。

$i$ 番のエモスポットを表す円内(円周上を含む)の任意の点と点 $(0, 0)$ を結ぶ線分の集合によって作られる領域を $S_i$ とする。

$1 \le j \le N, j \ne i$ を満たす $j$ について、$S_i$ と $C_j$ の共通部分がの面積を持たない。

Alice の代わりに、点 $(0,0)$ から見ることができるエモスポットの番号を求めてください。

制約

Hard (200点)

  • $1 \le N \le {10}^{5}$
  • $-{10}^5 \le x_i, y_i \le {10}^{5}$
  • $\left|x_i\right| + \left|y_i\right| \gt 1$
  • $1 \le r_i \lt \sqrt{x_i^2 + y_i^2}$
  • 任意の $2$ つのエモスポットは正の面積の共通部分を持たない
  • 入力はすべて整数

Normal (75点)

  • Hard の制約に以下の制約を追加
  • $1 \le N \le 1000$
  • $2 \le x_i \le 1000$
  • $-1000 \le y_i \le 1000$
  • $1 \le r_i \lt x_i$

Easy (75点)

  • Hard の制約に以下の制約を追加
  • $1 \le N \le 1000$
  • $3 \le x_i \le 1000$
  • $y_i \in \lbrace -x_i, 0, x_i \rbrace$
  • $r_i = 1$
部分点のみ解答したい場合

部分点のみを解答したい場合、問題によっては結果が TLE となるケースが大量に発生し、ジャッジに時間がかかる可能性があります。

C++の assert 関数やPythonの assert 文などを用いて、変数の値によってプログラムを強制終了させる処理を書き加えることで TLE を防ぎ、より早く結果を得ることができます。

入力

入力は以下の形式で標準入力から与えられます。

$N$
$x_1 \ \ y_1 \ \ r_1$
$\ \vdots$
$x_N \ \ y_N \ \ r_N$

出力

点 $(0,0)$ から見ることができるエモスポットの番号を昇順に空白区切りで $1$ 行に出力してください。

より具体的には、点 $(0,0)$ から見ることができるエモスポットが $P_1$ 番 $, \dots, P_k$ 番の $k$ ヵ所 $(1 \le P_1 < \dots < P_k \le N)$ であるとき、次の形式で出力してください。

$P_1 \ \ \dots \ \ P_k$

入力例 1
5 4 0 1 5 -5 1 3 3 1 3 -3 1 5 5 1
出力例 1
1 3 4

与えられるエモスポットの位置関係は次のようになっています。
$C_i$ が $i$ 番のエモスポットを表す円であることを表しています。

点 $(0, 0)$ から見ることができるエモスポットは $1, 3, 4$ 番のエモスポットなので、これらを空白区切りで昇順に出力してください。

この入出力例は Easy・Normal・Hard の制約を満たします。
特に、Easy ではすべてのエモスポットの中心が $y = x, 0, -x$ のいずれかを満たすことに注意してください。

入力例 2
10 7 -1 1 15 7 4 7 -12 2 4 -5 3 12 -6 1 4 10 1 9 -5 2 3 7 2 4 -1 1 9 0 1
出力例 2
2 8 9

与えられるエモスポットの位置関係は次のようになっています。

点 $(0, 0)$ から見ることができるエモスポットは $2, 8, 9$ 番のエモスポットなので、これらを空白区切りで昇順に出力してください。

これら以外のエモスポットは他のエモスポットによって一部分または全体を隠されているため、見ることができません。
いくつか例を挙げます。

  • $1$ 番のエモスポットは、$9$ 番のエモスポットに一部分を隠されているため、点 $(0,0)$ から見ることができません。
  • $4$ 番のエモスポットは、$9$ 番のエモスポットに一部分を隠されているため、点 $(0,0)$ から見ることができません。
  • $6$ 番のエモスポットは、$6$ 番のエモスポットに全体を隠されているため、点 $(0,0)$ から見ることができません。

この入出力例は Normal・Hard の制約を満たします。

入力例 3
10 15 12 4 3 -13 2 -1 -19 5 7 17 4 -13 -10 2 18 4 2 -9 8 4 -12 18 6 1 3 2 3 7 1
出力例 3
2 5 6 7 9

この入出力例は Hard の制約を満たします。

提出
C++23 (g++ 12.2.0)