問題
ある地域を $ H \times W $ のマス目で表します。
最初は、どのマスにも雪が積もっていませんでしたが、これから $N$ 日間に渡って雪が降り続けます。
上から $i$ 行目、左から $j$ 列目のマスを $(i,j)$ とするとき、$ t $ 日目にはマス$ (A_t,B_t) $を左上とし、マス$(C_t,D_t)$を右下とする長方形領域の積雪が$1cm$だけ増加することが予想されています。
最終的な各マスの積雪を出力してください。
[制約]
🔹$ 1 \leqq H,W \leqq 1500 $
🔹$ 1 \leqq N \leqq 100000 $
🔹$ 1 \leqq A_i \leqq C_i \leqq H $
🔹$ 1 \leqq B_i \leqq D_i \leqq W $
解き方・ソースコード
この問題も累積和を使って、少ない計算量で解くことができます。
具体的には前の要素との差分を計算し、その累積和をとることで解いていきます。
🔹マス $(a,b)$ およびマス $(c+1,d+1)$ を $+1$ する。【ソースコード 14~15行目】
🔹マス $(a,d+1)$ およびマス $(c+1,b)$ を $-1$ する。【ソースコード 16~17行目】
🔹2次元累積和をとる。(左から右への横の累積和をとったあとに、上から下への縦の累積和をとる)【ソースコード 20~25行目】
前計算に $ O(N) $ かかり、2次元累積和をとる処理に $ O(HW) $ かかるので、プログラム全体の計算量は $ O(N+HW) $ となります。
[Google Colaboratory]
1 | #-------- 入力例1 --------- |
[実行結果(入力例1)]
1 1 1 0 0 1 2 2 1 0 1 2 3 2 1 0 1 2 2 1 0 0 1 1 1
各マスの積雪を表示することができました。