SlideShare uma empresa Scribd logo
1 de 13
Baixar para ler offline
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 逆変換 !

Mais conteúdo relacionado

Mais procurados

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_Cs1190048
 
Cube
CubeCube
Cubeoupc
 
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.
 
UTPC2012 - K
UTPC2012 - KUTPC2012 - K
UTPC2012 - Komeometo
 
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.
 

Mais procurados (20)

Aizu-2017: B
Aizu-2017: BAizu-2017: B
Aizu-2017: B
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説AtCoder Beginner Contest 017 解説
AtCoder Beginner Contest 017 解説
 
abc027
abc027abc027
abc027
 
RUPC2014_Day2_C
RUPC2014_Day2_CRUPC2014_Day2_C
RUPC2014_Day2_C
 
Cube
CubeCube
Cube
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説AtCoder Beginner Contest 018 解説
AtCoder Beginner Contest 018 解説
 
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
 
UTPC2012 - K
UTPC2012 - KUTPC2012 - K
UTPC2012 - K
 
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)
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
球面フィッティングの導出と実装
球面フィッティングの導出と実装球面フィッティングの導出と実装
球面フィッティングの導出と実装
 
Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方
 
行列補完を用いた無線マルチキャスト符号構成アルゴリズム
行列補完を用いた無線マルチキャスト符号構成アルゴリズム行列補完を用いた無線マルチキャスト符号構成アルゴリズム
行列補完を用いた無線マルチキャスト符号構成アルゴリズム
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説
 
abc031
abc031abc031
abc031
 
ggplot2 110129
ggplot2 110129ggplot2 110129
ggplot2 110129
 

Semelhante a Pyramid

量子アニーリングマシンのプログラミング
量子アニーリングマシンのプログラミング量子アニーリングマシンのプログラミング
量子アニーリングマシンのプログラミング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 valuesatanic
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章Hiroki Mizukami
 
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1Computational Materials Science Initiative
 
Rのoptim関数でロバスト回帰(LMSとLAV)
Rのoptim関数でロバスト回帰(LMSとLAV)Rのoptim関数でロバスト回帰(LMSとLAV)
Rのoptim関数でロバスト回帰(LMSとLAV)wada, kazumi
 
Sanpo
SanpoSanpo
Sanpooupc
 
第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.5sleepy_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 noiseFujimoto Keisuke
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換京大 マイコンクラブ
 

Semelhante a Pyramid (17)

量子アニーリングマシンのプログラミング
量子アニーリングマシンのプログラミング量子アニーリングマシンのプログラミング
量子アニーリングマシンのプログラミング
 
Cv 14th
Cv 14thCv 14th
Cv 14th
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
 
CVIM#11 3. 最小化のための数値計算
CVIM#11 3. 最小化のための数値計算CVIM#11 3. 最小化のための数値計算
CVIM#11 3. 最小化のための数値計算
 
文書比較 (diff)
文書比較 (diff)文書比較 (diff)
文書比較 (diff)
 
University CodeSprint 4 - Magic value
University CodeSprint 4 - Magic valueUniversity CodeSprint 4 - Magic value
University CodeSprint 4 - Magic value
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章
 
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
CMSI計算科学技術特論A (2015) 第10回 行列計算における高速アルゴリズム1
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
Rのoptim関数でロバスト回帰(LMSとLAV)
Rのoptim関数でロバスト回帰(LMSとLAV)Rのoptim関数でロバスト回帰(LMSとLAV)
Rのoptim関数でロバスト回帰(LMSとLAV)
 
Sanpo
SanpoSanpo
Sanpo
 
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
 
Indeedなう B日程 解説
Indeedなう B日程 解説Indeedなう B日程 解説
Indeedなう B日程 解説
 
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
 
WUPC2nd G問題
WUPC2nd G問題WUPC2nd G問題
WUPC2nd G問題
 
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
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換
 

Mais de tomerun

Mastermind
MastermindMastermind
Mastermindtomerun
 
Ninja of Train
Ninja of TrainNinja of Train
Ninja of Traintomerun
 
U・N・C・O
U・N・C・OU・N・C・O
U・N・C・Otomerun
 
Vinculum
VinculumVinculum
Vinculumtomerun
 
Together
TogetherTogether
Togethertomerun
 

Mais de tomerun (10)

Mastermind
MastermindMastermind
Mastermind
 
Ninja of Train
Ninja of TrainNinja of Train
Ninja of Train
 
U・N・C・O
U・N・C・OU・N・C・O
U・N・C・O
 
Bitmap
BitmapBitmap
Bitmap
 
Vinculum
VinculumVinculum
Vinculum
 
Together
TogetherTogether
Together
 
Cheat
CheatCheat
Cheat
 
Cards
CardsCards
Cards
 
Match
MatchMatch
Match
 
Contest
ContestContest
Contest
 

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 逆変換 !