Description:

二次元平面上に親水性の分子と親油性の分子がN個存在する。(1 <= N <= 1000)
この平面上に一本直線を引き、直線の片側に水を、反対側にアセトンを入れる。
最大でどれだけの分子を溶かすことが出来るか?
座標の取り得る値は整数値で、-1万 <= X,Y <= 1万。
直線上の分子は、水にもアセトンにも接する故溶けるものとする。

Answer:

任意の二つの分子を結ぶ直線を考えて、各分子が溶けるかを考えると、O(N^3)となりTLE。
この計算量を落としてくださいという問題。
まず一つの分子に注目し、その分子と他の分子を結ぶ直線を角度でソートする。
一番角度の小さい直線を引いた時に溶ける分子の数を計算し、直線を順番に見ながら溶ける分子の数を更新していけば、O(N)で各直線における溶けた分子の量を計算できる。

計算量はO(N^2 log(N))

Source: