ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC129 D - Lamp

問題
提出コード

解法

O(N^{2})が間に合うので、(i,j)に設置した際に照らすことができるマスの個数がO(1)で求まれば、全探索をしつつ最大値を求めることでこの問題に答えることができます。
ということで、前計算をします。
まず、縦に伸びる光と横に伸びる光は無関係のため、独立に考えることができます。
今回は、横に伸びる方について考えていきます。
i行目について考えると、左端のマスから順にみていき、
j列目、つまりs_{ij}に障害物がない場合、そこから右側に連続して障害物がない場所の個数を調べ、調べた箇所に対して、その個数をメモする、という操作を行うことで、横方向で照らすことのできるマスの個数がわかります。
同様のことを縦方向についても行うことで、s_{ij}に明かりを設置した結果、照らすことのできるマスの個数が以下のようにして求められます。

  • (縦方向の伸びる光によって照らすことができるマスの個数)+(横方向の伸びる光によって照らすことができるマスの個数)-1

この-1は、それぞれの方向について、s_{ij}が含まれているため、その分だけ重複して数えているからです。
あとは、全てのs_{ij}について上の値を調べ、最大値をとれば答えとなります。

感想

バグらなくてよかったです…
メモをするだけで簡単に計算量が間に合う部分まではわかるのですが、その後どの実装をするのが一番軽いか、という選択が難しいです。