きろく

特筆すべき記録のまとめ

JOI '10 春合宿1:2- 戦国時代 (Sengoku)

問題

https://www.ioi-jp.org/camp/2010/2010-sp-tasks/2010-sp-day1_20.pdf

解法

各見張りの監視する範囲はその見張りの位置を中心とする × の形になる.ここで,領地を 45 度回転させてひし形にして考えると,各見張りの監視する範囲は x, y 軸に共に平行になる形になるので,行と列の形で扱いやすくなる.どの行・列が監視されているかを map で管理しておき,行の次に列の順に答えを計算していく.

行に関しては,素直に答えにその行に含まれるマスの数を足す.列に関しては,その列に含まれる監視対象の行の数を計算する必要がある(なぜならば,行と列の交点となるマスで重複が出てしまうから).これは,監視対象の行の index をソートして持って置き,std::lower_bound() と std::upper_bound() を用いることで O(logL) で計算することが出来る.O(NlogN + LlogN).

解答

atcoder.jp

監視対象の行の index で二分探索をするところで実装ミスをしてしまった.

f:id:babcs2035:20190201223015p:plain