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

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 

Recently uploaded (9)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 

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%