SlideShare a Scribd company logo
1 of 14
Download to read offline
第2回  早稲⽥田⼤大学プログラミングコンテスト


    G: だるま落落とし
    keyword: ⼆二分探索索、データ構造
問題概要


a[n-1]      .
            .
            .

 a[2]

 a[1]


 a[0]           2H : ハンマーの幅
問題概要


a[n-1]      .
            .
            .
                          arg

 a[2]

 a[1]


 a[0]                      2H : ハンマーの幅



     [!] addクエリ : ⾼高さargのブロックを上に追加
問題概要


a[n-1]      .
            .
            .

 a[2]
                         H
 a[1]
                         H
 a[0]              arg


     [!] challengeクエリ : ⾼高さarg(>=H)で叩く
問題概要


a[n-1]      .
            .
            .

  だるま落落としをシミュレーションし、
 a[2]

  クエリをたくさん処理理してください。
 a[1]
           H
                         H
 a[0]              arg


     [!] challengeクエリ : ⾼高さarg(>=H)で叩く
制約
¤  制約
  ¤  初期ブロックの数 <= 100,000
  ¤  クエリの数  <= 100,000
愚直にやると
¤  配列列による実装
 ¤  配列列の各要素にだるまの⾼高さを持つ

¤  各クエリに対する処理理
 ¤  addクエリ
     ¤  配列列の末尾に追加 / O(1)
 ¤  challengeクエリ
   ¤  どのブロックが叩かれるか探す / O(N)
   ¤  “go”の場合、ブロックを詰める / O(N)

¤  クエリ数が多いのでこれでは間に合わない。
まず考えるべきこと
¤  ⾼高さの累累積和を持っておく
 ¤  addクエリ
     ¤  配列列の末尾に追加 / O(1)
 ¤  challengeクエリ
   ¤  どのブロックが叩かれるか探す / ⼆二分探索索でO(logN)
   ¤  “go”の場合、ブロックを詰める / O(N)


¤  ハンマーの上⾯面と下⾯面に当たるブロックの位置を探す。
 ¤  両者が同じなら “go”  違うなら “stop”

¤  ブロックを詰める操作をなんとかして⼯工夫したい。
重要な考え⽅方


a[n-1]        .
              .
              .
                            a[n-2]   .
 a[2]
                                     .
                                     .
 a[1]        削除
                             a[1]

 a[0]                        a[0]



         [!] a[1] を抜かして配列列を詰めた
重要な考え⽅方


a[n-1]      .
            .
            .
                                a[n-1]
                                         .
 a[2]                                    .
                                         .
 a[1]      ⾼高さを
                                 a[2]
            0に
                     a[1] = 0
 a[0]                            a[0]



    [!] a[1] を 0 にした ⇒ 配列列サイズは変えなくていい
解決策
¤  Fenwick Tree(BIT : Binary Indexed Treeとも)
  ¤  累累積和を効率率率よく処理理できるデータ構造!

¤  以下のことがそれぞれO(logN)で可能
  ¤  a[1]〜~a[k] までの累累積和を求める
  ¤  a[k] の値を更更新する

¤  ⇒ 今回の⽤用途にピッタリ!
  ¤  addクエリ
     ¤  ブロックの総数を覚えておいて、末尾位置に更更新クエリ
  ¤  challengeクエリ
      ¤  累累積和クエリを使って⼆二分探索索し、位置を求める
     ¤  “go” なら、⾒見見つけた位置のブロックに更更新クエリ
⼀一番上のブロックを叩く時
¤  上部に処理理後ブロック(サイズが0)が溜溜まると誤判定の可能性が!

¤  ⼀一番上かどうかの判定
 ¤  シミュレーション中、
     だるまの⾼高さを持っておく(Hとおく)
 ¤  ハンマーの下⾯面位置に当たる
     ブロックの最下部位置を  X とする
                                  サイズ0
                                  = 処理理後
 ¤  X + (ブロックの⾼高さ) = H なら⼀一番上!


                                  ⼀一番上
解法
¤  クエリを先読みして、登場するブロック数をカウント

¤  そのサイズでFenwick Treeを初期化

¤  クエリが来るたびに、以下の処理理をする
    ¤  addクエリ
        ¤  現在の末尾位置にブロックのサイズで更更新クエリ
    ¤  challengeクエリ
        ¤  累累積和クエリを使って⼆二分探索索し、位置を求める
      ¤  “go” なら、⾒見見つけた位置のブロックに更更新クエリ
統計
¤  First AC : hos.lyric* (56:09)

¤  正解数 : 31
   ¤  通した⼈人(31/205) : 15%
   ¤  ACだった解答(31/281) : 11%

More Related Content

Similar to WUPC2nd G問題

Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriYuta Okamoto
 
Jokyonokai
JokyonokaiJokyonokai
Jokyonokainwpmq516
 
Jokyonokai
JokyonokaiJokyonokai
Jokyonokainwpmq516
 
ナップサックDPを説明してみた
ナップサックDPを説明してみたナップサックDPを説明してみた
ナップサックDPを説明してみたKoya Fukuda
 
ACLreading2014@Ace12358
ACLreading2014@Ace12358ACLreading2014@Ace12358
ACLreading2014@Ace12358Ace12358
 
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Search
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical SearchWSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Search
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Searchsleepy_yoshi
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜Tomoki Yoshida
 

Similar to WUPC2nd G問題 (10)

Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
Jokyonokai
JokyonokaiJokyonokai
Jokyonokai
 
Jokyonokai
JokyonokaiJokyonokai
Jokyonokai
 
ナップサックDPを説明してみた
ナップサックDPを説明してみたナップサックDPを説明してみた
ナップサックDPを説明してみた
 
ACLreading2014@Ace12358
ACLreading2014@Ace12358ACLreading2014@Ace12358
ACLreading2014@Ace12358
 
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Search
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical SearchWSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Search
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Search
 
Pyramid
PyramidPyramid
Pyramid
 
Gurobi python
Gurobi pythonGurobi python
Gurobi python
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
 

More from Dai Hamada

修士論文発表資料
修士論文発表資料修士論文発表資料
修士論文発表資料Dai Hamada
 
WUPC2nd C問題
WUPC2nd C問題WUPC2nd C問題
WUPC2nd C問題Dai Hamada
 
WUPC2nd A問題
WUPC2nd A問題WUPC2nd A問題
WUPC2nd A問題Dai Hamada
 
WUPC2nd I問題
WUPC2nd I問題WUPC2nd I問題
WUPC2nd I問題Dai Hamada
 
WUPC2nd E問題
WUPC2nd E問題WUPC2nd E問題
WUPC2nd E問題Dai Hamada
 

More from Dai Hamada (7)

DP特集
DP特集DP特集
DP特集
 
修士論文発表資料
修士論文発表資料修士論文発表資料
修士論文発表資料
 
WUPC2nd C問題
WUPC2nd C問題WUPC2nd C問題
WUPC2nd C問題
 
WUPC2nd A問題
WUPC2nd A問題WUPC2nd A問題
WUPC2nd A問題
 
WUPC2nd I問題
WUPC2nd I問題WUPC2nd I問題
WUPC2nd I問題
 
WUPC2nd E問題
WUPC2nd E問題WUPC2nd E問題
WUPC2nd E問題
 
WUPC2012
WUPC2012WUPC2012
WUPC2012
 

Recently uploaded

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Recently uploaded (9)

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

WUPC2nd G問題

  • 1. 第2回  早稲⽥田⼤大学プログラミングコンテスト G: だるま落落とし keyword: ⼆二分探索索、データ構造
  • 2. 問題概要 a[n-1] . . . a[2] a[1] a[0] 2H : ハンマーの幅
  • 3. 問題概要 a[n-1] . . . arg a[2] a[1] a[0] 2H : ハンマーの幅 [!] addクエリ : ⾼高さargのブロックを上に追加
  • 4. 問題概要 a[n-1] . . . a[2] H a[1] H a[0] arg [!] challengeクエリ : ⾼高さarg(>=H)で叩く
  • 5. 問題概要 a[n-1] . . . だるま落落としをシミュレーションし、 a[2] クエリをたくさん処理理してください。 a[1] H H a[0] arg [!] challengeクエリ : ⾼高さarg(>=H)で叩く
  • 6. 制約 ¤  制約 ¤  初期ブロックの数 <= 100,000 ¤  クエリの数  <= 100,000
  • 7. 愚直にやると ¤  配列列による実装 ¤  配列列の各要素にだるまの⾼高さを持つ ¤  各クエリに対する処理理 ¤  addクエリ ¤  配列列の末尾に追加 / O(1) ¤  challengeクエリ ¤  どのブロックが叩かれるか探す / O(N) ¤  “go”の場合、ブロックを詰める / O(N) ¤  クエリ数が多いのでこれでは間に合わない。
  • 8. まず考えるべきこと ¤  ⾼高さの累累積和を持っておく ¤  addクエリ ¤  配列列の末尾に追加 / O(1) ¤  challengeクエリ ¤  どのブロックが叩かれるか探す / ⼆二分探索索でO(logN) ¤  “go”の場合、ブロックを詰める / O(N) ¤  ハンマーの上⾯面と下⾯面に当たるブロックの位置を探す。 ¤  両者が同じなら “go”  違うなら “stop” ¤  ブロックを詰める操作をなんとかして⼯工夫したい。
  • 9. 重要な考え⽅方 a[n-1] . . . a[n-2] . a[2] . . a[1] 削除 a[1] a[0] a[0] [!] a[1] を抜かして配列列を詰めた
  • 10. 重要な考え⽅方 a[n-1] . . . a[n-1] . a[2] . . a[1] ⾼高さを a[2] 0に a[1] = 0 a[0] a[0] [!] a[1] を 0 にした ⇒ 配列列サイズは変えなくていい
  • 11. 解決策 ¤  Fenwick Tree(BIT : Binary Indexed Treeとも) ¤  累累積和を効率率率よく処理理できるデータ構造! ¤  以下のことがそれぞれO(logN)で可能 ¤  a[1]〜~a[k] までの累累積和を求める ¤  a[k] の値を更更新する ¤  ⇒ 今回の⽤用途にピッタリ! ¤  addクエリ ¤  ブロックの総数を覚えておいて、末尾位置に更更新クエリ ¤  challengeクエリ ¤  累累積和クエリを使って⼆二分探索索し、位置を求める ¤  “go” なら、⾒見見つけた位置のブロックに更更新クエリ
  • 12. ⼀一番上のブロックを叩く時 ¤  上部に処理理後ブロック(サイズが0)が溜溜まると誤判定の可能性が! ¤  ⼀一番上かどうかの判定 ¤  シミュレーション中、 だるまの⾼高さを持っておく(Hとおく) ¤  ハンマーの下⾯面位置に当たる ブロックの最下部位置を  X とする サイズ0 = 処理理後 ¤  X + (ブロックの⾼高さ) = H なら⼀一番上! ⼀一番上
  • 13. 解法 ¤  クエリを先読みして、登場するブロック数をカウント ¤  そのサイズでFenwick Treeを初期化 ¤  クエリが来るたびに、以下の処理理をする ¤  addクエリ ¤  現在の末尾位置にブロックのサイズで更更新クエリ ¤  challengeクエリ ¤  累累積和クエリを使って⼆二分探索索し、位置を求める ¤  “go” なら、⾒見見つけた位置のブロックに更更新クエリ
  • 14. 統計 ¤  First AC : hos.lyric* (56:09) ¤  正解数 : 31 ¤  通した⼈人(31/205) : 15% ¤  ACだった解答(31/281) : 11%