狠狠撸

狠狠撸Share a Scribd company logo
Pyramid

   原案: komiya
問題概要

   N*M(N, M≦1000) の行列 X があり、初期状態では
    全ての要素が 0 。
   以下のクエリが Q(≦10^6) 個あるので、全て処理し
    た後の行列を求めよ。
      X[i, j] += max( 0, d - (| i – a | + | j – b |) )
      1 ≦ d ≦ max(N, M), 1≦a≦N, 1≦b≦M
解法

   一部でいもす法と呼ばれているアイデアを使う。
   JOI 界隈では頻出?
いもす法って?

   区間への加算を、定数箇所の更新だけで済ませる。
   加算された値を具体的に知りたくなったら累積和
    をとる。

                    愚直      いもす法

       更新 ( 加算 )    O(n)     O(1)
                   O(H*W)
          参照        O(1)     O(n)
        (a[i]=?)            O(H*W)

   本問題のように、更新が多く参照が少ない状況に
    適している。
いもす法って?

   結局何をやっているのか?
   累積和の逆変換 ( 階差数列 ) を利用している。


         +1 +1 +1 +1 +1            O(n) 箇所の更新が必要


       階差数列    累積和
                     どっち向きの変換も
                     計算量 O(n)

         +1               -1       定数箇所の更新で済む


                                 処理が軽いので、加算クエリが多
                                 いときはこっちの世界で処理する
                                 方が効率良い
いもす法って?

   さっきの話は 2 次元以上にも拡張できる!



       2    1   -1            2   3   2
                       累積和

       0    3   2             2   6   7

       -2   1   -1     逆変換    0   5   5


                     変換に必要な計算量は
                     O(H*W)
範囲和の処理

   例えば次のようなクエリを処理することを考えよう。

                    +1

               +1   +2   +1

          +1   +2   +3   +2   +1

               +1   +2   +1

                    +1
範囲和の処理

   累積和の逆変換を行うと次のような区間和になる。

                    +1   -1

               +1             -1

          +1                       -1

          -1                       +1

               -1             +1

                    -1   +1
範囲和の処理

   今度は斜め方向に累積和の逆変換をとる。

             +1




        -1        +1




             -1
範囲和の処理

   こっち方向でも逆変換。

                  -1




          -1           +1




                  +1
細かいところ:端の処理

   ピラミッド型範囲和が端で途切れると処理が面倒
    なので、行列を拡大して考えると楽。



    実際の行列
    の範囲
解法まとめ

   端で途切れるのを防ぐため、行列を拡大する。
   Q 個のクエリを処理する。右下方向と左下方向に
    分けてそれぞれ定数箇所に値を加える。
   右下方向と左下方向で累積和をとる。
   右下方向と左下方向の累積和を重ね合わせる。
   重ね合わせたものの 2 次元累積和をとる。
おまけ

   同様の手法で次のような加算クエリも処理できる。

     +1   +1   +1   +1   +1

     +1   +2   +2   +2   +1

     +1   +2   +3   +2   +1

     +1   +2   +2   +2   +1

     +1   +1   +1   +1   +1



                                 Let's 逆変換 !

More Related Content

What's hot (20)

AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
AtCoder Inc.
?
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説
AtCoder Inc.
?
abc027
abc027abc027
abc027
AtCoder Inc.
?
RUPC2014_Day2_C
RUPC2014_Day2_CRUPC2014_Day2_C
RUPC2014_Day2_C
s1190048
?
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
AtCoder Inc.
?
AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説
AtCoder Inc.
?
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
AtCoder Inc.
?
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)
HCPC: 北海道大学競技プログラミングサークル
?
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
AtCoder Inc.
?
球面フィッティングの导出と実装
球面フィッティングの导出と実装球面フィッティングの导出と実装
球面フィッティングの导出と実装
j_rocket_boy
?
Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方
Masaru Watanabe
?
行列补完を用いた无线マルチキャスト符号构成アルゴリズム
行列补完を用いた无线マルチキャスト符号构成アルゴリズム行列补完を用いた无线マルチキャスト符号构成アルゴリズム
行列补完を用いた无线マルチキャスト符号构成アルゴリズム
Tasuku Soma
?
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
AtCoder Inc.
?
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説
AtCoder Inc.
?
abc031
abc031abc031
abc031
AtCoder Inc.
?
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
AtCoder Inc.
?
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説
AtCoder Inc.
?
RUPC2014_Day2_C
RUPC2014_Day2_CRUPC2014_Day2_C
RUPC2014_Day2_C
s1190048
?
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
AtCoder Inc.
?
AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説
AtCoder Inc.
?
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
AtCoder Inc.
?
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
AtCoder Inc.
?
球面フィッティングの导出と実装
球面フィッティングの导出と実装球面フィッティングの导出と実装
球面フィッティングの导出と実装
j_rocket_boy
?
Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方
Masaru Watanabe
?
行列补完を用いた无线マルチキャスト符号构成アルゴリズム
行列补完を用いた无线マルチキャスト符号构成アルゴリズム行列补完を用いた无线マルチキャスト符号构成アルゴリズム
行列补完を用いた无线マルチキャスト符号构成アルゴリズム
Tasuku Soma
?
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
AtCoder Inc.
?
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説
AtCoder Inc.
?

Similar to Pyramid (17)

量子アニーリングマシンのプログラミング
量子アニーリングマシンのプログラミング量子アニーリングマシンのプログラミング
量子アニーリングマシンのプログラミング
nishio
?
凸最適化 ? 双対定理とソルバーCVXPYの紹介 ?
凸最適化 ? 双対定理とソルバーCVXPYの紹介 ?凸最適化 ? 双対定理とソルバーCVXPYの紹介 ?
凸最適化 ? 双対定理とソルバーCVXPYの紹介 ?
Tomoki Yoshida
?
CVIM#11 3. 最小化のための数値計算
CVIM#11 3. 最小化のための数値計算CVIM#11 3. 最小化のための数値計算
CVIM#11 3. 最小化のための数値計算
sleepy_yoshi
?
文書比較 (diff)
文書比較 (diff)文書比較 (diff)
文書比較 (diff)
Satoshi MATSUURA
?
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
satanic
?
自然言语処理のための机械学习入门1章
自然言语処理のための机械学习入门1章自然言语処理のための机械学习入门1章
自然言语処理のための机械学习入门1章
Hiroki Mizukami
?
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
Computational Materials Science Initiative
?
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル
?
搁の辞辫迟颈尘関数でロバスト回帰(尝惭厂と尝础痴)
搁の辞辫迟颈尘関数でロバスト回帰(尝惭厂と尝础痴)搁の辞辫迟颈尘関数でロバスト回帰(尝惭厂と尝础痴)
搁の辞辫迟颈尘関数でロバスト回帰(尝惭厂と尝础痴)
wada, kazumi
?
Sanpo
SanpoSanpo
Sanpo
oupc
?
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
RCCSRENKEI
?
Indeedなう B日程 解説
Indeedなう B日程 解説Indeedなう B日程 解説
Indeedなう B日程 解説
AtCoder Inc.
?
PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5
sleepy_yoshi
?
WUPC2nd G問題
WUPC2nd G問題WUPC2nd G問題
WUPC2nd G問題
Dai Hamada
?
L0TV: a new method for image restoration in the presence of impulse noise
L0TV: a new method for image restoration in the presence of impulse noiseL0TV: a new method for image restoration in the presence of impulse noise
L0TV: a new method for image restoration in the presence of impulse noise
Fujimoto Keisuke
?
多倍长整数の乗算と高速フーリエ変换
多倍长整数の乗算と高速フーリエ変换多倍长整数の乗算と高速フーリエ変换
多倍长整数の乗算と高速フーリエ変换
京大 マイコンクラブ
?
量子アニーリングマシンのプログラミング
量子アニーリングマシンのプログラミング量子アニーリングマシンのプログラミング
量子アニーリングマシンのプログラミング
nishio
?
凸最適化 ? 双対定理とソルバーCVXPYの紹介 ?
凸最適化 ? 双対定理とソルバーCVXPYの紹介 ?凸最適化 ? 双対定理とソルバーCVXPYの紹介 ?
凸最適化 ? 双対定理とソルバーCVXPYの紹介 ?
Tomoki Yoshida
?
CVIM#11 3. 最小化のための数値計算
CVIM#11 3. 最小化のための数値計算CVIM#11 3. 最小化のための数値計算
CVIM#11 3. 最小化のための数値計算
sleepy_yoshi
?
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
satanic
?
自然言语処理のための机械学习入门1章
自然言语処理のための机械学习入门1章自然言语処理のための机械学习入门1章
自然言语処理のための机械学习入门1章
Hiroki Mizukami
?
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
Computational Materials Science Initiative
?
搁の辞辫迟颈尘関数でロバスト回帰(尝惭厂と尝础痴)
搁の辞辫迟颈尘関数でロバスト回帰(尝惭厂と尝础痴)搁の辞辫迟颈尘関数でロバスト回帰(尝惭厂と尝础痴)
搁の辞辫迟颈尘関数でロバスト回帰(尝惭厂と尝础痴)
wada, kazumi
?
Sanpo
SanpoSanpo
Sanpo
oupc
?
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
RCCSRENKEI
?
Indeedなう B日程 解説
Indeedなう B日程 解説Indeedなう B日程 解説
Indeedなう B日程 解説
AtCoder Inc.
?
PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5
sleepy_yoshi
?
L0TV: a new method for image restoration in the presence of impulse noise
L0TV: a new method for image restoration in the presence of impulse noiseL0TV: a new method for image restoration in the presence of impulse noise
L0TV: a new method for image restoration in the presence of impulse noise
Fujimoto Keisuke
?

Pyramid

  • 1. Pyramid  原案: komiya
  • 2. 問題概要  N*M(N, M≦1000) の行列 X があり、初期状態では 全ての要素が 0 。  以下のクエリが Q(≦10^6) 個あるので、全て処理し た後の行列を求めよ。   X[i, j] += max( 0, d - (| i – a | + | j – b |) ) 1 ≦ d ≦ max(N, M), 1≦a≦N, 1≦b≦M
  • 3. 解法  一部でいもす法と呼ばれているアイデアを使う。  JOI 界隈では頻出?
  • 4. いもす法って?  区間への加算を、定数箇所の更新だけで済ませる。  加算された値を具体的に知りたくなったら累積和 をとる。 愚直 いもす法 更新 ( 加算 ) O(n) O(1) O(H*W) 参照 O(1) O(n) (a[i]=?) O(H*W)  本問題のように、更新が多く参照が少ない状況に 適している。
  • 5. いもす法って?  結局何をやっているのか?  累積和の逆変換 ( 階差数列 ) を利用している。 +1 +1 +1 +1 +1 O(n) 箇所の更新が必要 階差数列 累積和 どっち向きの変換も 計算量 O(n) +1 -1 定数箇所の更新で済む 処理が軽いので、加算クエリが多 いときはこっちの世界で処理する 方が効率良い
  • 6. いもす法って?  さっきの話は 2 次元以上にも拡張できる! 2 1 -1 2 3 2 累積和 0 3 2 2 6 7 -2 1 -1 逆変換 0 5 5 変換に必要な計算量は O(H*W)
  • 7. 範囲和の処理  例えば次のようなクエリを処理することを考えよう。 +1 +1 +2 +1 +1 +2 +3 +2 +1 +1 +2 +1 +1
  • 8. 範囲和の処理  累積和の逆変換を行うと次のような区間和になる。 +1 -1 +1 -1 +1 -1 -1 +1 -1 +1 -1 +1
  • 9. 範囲和の処理  今度は斜め方向に累積和の逆変換をとる。 +1 -1 +1 -1
  • 10. 範囲和の処理  こっち方向でも逆変換。 -1 -1 +1 +1
  • 11. 細かいところ:端の処理  ピラミッド型範囲和が端で途切れると処理が面倒 なので、行列を拡大して考えると楽。 実際の行列 の範囲
  • 12. 解法まとめ  端で途切れるのを防ぐため、行列を拡大する。  Q 個のクエリを処理する。右下方向と左下方向に 分けてそれぞれ定数箇所に値を加える。  右下方向と左下方向で累積和をとる。  右下方向と左下方向の累積和を重ね合わせる。  重ね合わせたものの 2 次元累積和をとる。
  • 13. おまけ  同様の手法で次のような加算クエリも処理できる。 +1 +1 +1 +1 +1 +1 +2 +2 +2 +1 +1 +2 +3 +2 +1 +1 +2 +2 +2 +1 +1 +1 +1 +1 +1  Let's 逆変換 !