lines - 直線 (Lines) Editorial
by
Mitsubachi
入力の直線が全て異なるとします。直線を何本か引いた状態から新しく $1$ 本引いた場合の差分を考えましょう。また、この問題は無限大に大きい正方形の中に直線を引くとしても問題がないので、それが成り立っているとします。
直線 $l$ を引いたとき、 $x$ 個の領域を通過したとします。このとき、領域の個数は $l$ により $x$ 増加します。なぜなら、各領域は無限大に大きい正方形の中で行っているので凸である多角形であるからです。
また、 $x$ は既に引いた直線との交点の数に $1$ を足したものに一致します。領域の境界は既に引いた直線の一部であり、交点の前後で同じ領域に属しているのは明らかにありえないためです。
よって既に引いた直線との交点の数を求めることに帰着できます。これは既に引いた直線を $1$ 本ずつ見ても $O(N^2)$ で解くことができます。
直線の管理の仕方としては \(y=ax+b\) や \(ax+by+c=0\) の形で管理するのが楽でしょう。ただし、前者は \(x=2\) といった形に直接対応できないので注意してください。なお、傾きが \(\infty\) である直線とみなすことは可能です。例えば \(x=v\) ならば十分大きな整数 \(z\) を用い \(a=z,b=-vz\) とすることで管理ができます。
なお、本問題では実装の過程で分数が出てきますが、小数として管理するよりも整数同士のpairとして管理した方が誤差を気にせず解くことができます。
posted:
last update: