pekempeyのブログ

競技プログラミングに関する話題を書いていきます。

CodeChef July Challenge: Defend the Recipe

解法

各線分による領域の共通部分を取ればよい。これは直線を使って凸包を作る問題となる。

次の図はサンプル 2の領域。

f:id:pekempey:20160703170451p:plain:w400

もう少し複雑な図形なら次のような感じ。

f:id:pekempey:20160703174345p:plain:w400

直線から凸包を作るには、点から凸包を作るのと大体同じ手法が使える。直線を方向ベクトルで偏角ソートし、逐次直線を追加していけばいい。

直線から凸包を作るのは convex hull trick で慣れてたけど、今回みたいに全方位の直線はやったことがなくてかなりバグらせてた。