Dragon(ドラゴン) - joi2011-day1 解説
筆者: qnighy
ドラゴンが上下左右に火炎を放射し、M理事長がそれを止めることができるとき、火炎が放射されていない範囲の最大値を求める問題である。
O(N+WH)解法
…
O(N^2)解法
…
O(NlogN)解法
まず、M理事長がいない場合にどの範囲が利用できるかを数えておく。これは(W-ドラゴンのいる列)×(H-ドラゴンのいる行)で計算できる。
そこで、M理事長がある位置に配置されたときに、新たにどれくらいのマスが使えるようになるか考える。
まず、水平方向あるいは垂直方向のいずれかにのみ2.であるような状況を考えよう。
このとき、できるだけドラゴンに近いほうが、より多くのマスが使えるようになる。
(なお、使えるようになるマスは、M理事長が塞いだ先のマス目の個数から、その列に垂直に横切る炎の個数を引いた数になる。)
次に、水平方向と垂直方向の両方に2.であるような状況を考える。つまり、M理事長は炎の交わる点にいる。これは、右上、右下、左上、左下のそれぞれについて分けて考えるのが良い。
例えば、右下向きの炎を塞ぐことを考えよう。このとき、上から下に走査するとすると、そのx座標に交差する縦向きの炎はRMQや平衡二分木などで管理すればよい。とにかくこれは実装が重いだけである。
この方法でO(NlogN)で計算することができる。
注意
x座標が縦、y座標が横である。