SlideShare a Scribd company logo
さんぽ
原案 : komiya, fura2
解答 : komiya, fura2
  解説 : fura2
問題概要
●   N 頂点の木がある
●   辺 i を通ると、m_i 回目までの通行ではスコア v_i
    が得られる。m_i+1 回目以降は何も得られない
●   また、辺 i には通行に必要なコスト t_i がある
●   頂点 1 からはじまり頂点 1 で終わるような、合計コ
    スト T 以下のウォークで、得られるスコアの合計を
    最大化せよ
例
T=15
             1    1/10

       3/1
2                     5
              8/777
 3/1         4
3       (コスト/☆の価値)
例
●   答えは 10 + 10 + 10 + 1 + 1 = 32
           T=15
                        1      1/10

                  3/1
            2                       5
                         8/777
             3/1        4
            3      (コスト/☆の価値)
解法
●   DP です
    –   以下、詳しく説明します

●
    当分の間、説明を簡単にするため、m_i は正の偶数で
    あるとします
解法
●   考えやすくするため、木を列にしておく
    –   根から DFS して、頂点を通った順に並べる。(Euler
        tour technique) 1


               2             5

                      4
               3


              1 2 3 2 1 4 1 5 1
解法
●   さっきの列を a[1], a[2], … とする

●   dp[i][w] := ( a[i] まで見ていて、ここまでの
              コストが w であるときの最大価値 )
    –   ただし、行きに往復分のコストを払い、帰りはコスト 0 と
        思う
解法
●   DP の遷移は ( a[i-1] → a[i] が下りの辺のとき )
    dp[i][w] := max(dp[prev[i]][w],
        max{ dp[i-1][w-c*t_i]+c*v_i | c=2,4,…,m_i } )

●   ここで、
    –   prev[i] := ( j < i かつ a[i] == a[j] となる最大の j )
    –   t_i := ( 辺 a[i-1] → a[i] のコスト )
    –   m_i := ( 辺 a[i-1] → a[i] の価値が得られる回数の上限 )
    –   v_i := ( 辺 a[i-1] → a[i] の価値 )
解法
    dp[i][w] := max(dp[prev[i]][w],
      max{ dp[i-1][w-c*t_i]+c*v_i | c=2,4,…,m_i } )

●   部分木 a[prev[i]], …, a[i-1] を無視することを表す
    遷移
解法
    dp[i][w] := max(dp[prev[i]][w],
      max{ dp[i-1][w-c*t_i]+c*v_i | c=2,4,…,m_i } )

●   辺 a[i-1] → a[i] を c/2 回往復することを表す遷移
解法
●   以上を素直に実装すると、O(NTM) かかり、TLE し
    てしまう
    –   M := max{ m_1, m_2, …, m_{N-1} }


●   DP の更新式
    dp[i][w] := max(dp[prev[i]][w],
     max{ dp[i-1][w-c*t_i]+c*v_i | c=2,4,…,m_i } )
    をよく見てみると...
解法
●   ナップザック問題の DP と同じだ!
    –   しかも c=2,4,…,m_i なので、これは個数制限つ
        きナップザック

●   個数制限つきナップザックの高速化はよく知られて
    います
    – m_i を 2, 4, 8, … と O(log m_i) 個に分割する
    – あるいは、スライド最小値を使う
       どちらも蟻本に載っています
解法
●   というわけで、

●   さっきの DP は O(NT log M) または O(NT) で計
    算できます

●   これで間に合う
コーナーケース
●   m_i が奇数のときは、全部の☆を拾うケースがあ
    るので、DP の遷移がひとつ増える。( サンプルに
    あります )

●   m_i = 0 のときは、☆を拾わずに i を進める遷移が
    増える
提出状況
●   AC Rate
    –   20.00 % (1/5)


●   First Acceptance
    –   Onsite: magyorin (269 min)
    –   All: magyorin (269 min)

More Related Content

What's hot

RUPC2014_Day2_C
RUPC2014_Day2_CRUPC2014_Day2_C
RUPC2014_Day2_C
s1190048
 
K2PC Div1 E 暗号化
K2PC Div1 E 暗号化K2PC Div1 E 暗号化
K2PC Div1 E 暗号化
Kazuma Mikami
 
会津合宿2015Day3:D問題
会津合宿2015Day3:D問題会津合宿2015Day3:D問題
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paiza
 
PRML 9章
PRML 9章PRML 9章
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
AtCoder Inc.
 
情報オリンピック夏合宿発表
情報オリンピック夏合宿発表情報オリンピック夏合宿発表
情報オリンピック夏合宿発表
Kazuma Mikami
 
WUPC2nd A問題
WUPC2nd A問題WUPC2nd A問題
WUPC2nd A問題
Dai Hamada
 
Joi模擬予選2013 6番解説
Joi模擬予選2013 6番解説Joi模擬予選2013 6番解説
Joi模擬予選2013 6番解説
DEGwer
 
Four op
Four opFour op
Four op
oupc
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
AtCoder Inc.
 
D : 解説
D : 解説D : 解説
D : 解説
Takumi Yamashita
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
競技プログラミングの楽しみ
競技プログラミングの楽しみ競技プログラミングの楽しみ
競技プログラミングの楽しみ
na_o_ys
 
JOISS2015 グレブナー基底発表joisinoお姉ちゃんを救おう
JOISS2015 グレブナー基底発表joisinoお姉ちゃんを救おうJOISS2015 グレブナー基底発表joisinoお姉ちゃんを救おう
JOISS2015 グレブナー基底発表joisinoお姉ちゃんを救おう
Kai Katsumata
 
公開鍵暗号(1): RSA暗号
公開鍵暗号(1): RSA暗号公開鍵暗号(1): RSA暗号
公開鍵暗号(1): RSA暗号
Joe Suzuki
 

What's hot (20)

RUPC2014_Day2_C
RUPC2014_Day2_CRUPC2014_Day2_C
RUPC2014_Day2_C
 
1
11
1
 
K2PC Div1 E 暗号化
K2PC Div1 E 暗号化K2PC Div1 E 暗号化
K2PC Div1 E 暗号化
 
会津合宿2015Day3:D問題
会津合宿2015Day3:D問題会津合宿2015Day3:D問題
会津合宿2015Day3:D問題
 
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
 
PRML 9章
PRML 9章PRML 9章
PRML 9章
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
情報オリンピック夏合宿発表
情報オリンピック夏合宿発表情報オリンピック夏合宿発表
情報オリンピック夏合宿発表
 
Dbda勉強会
Dbda勉強会Dbda勉強会
Dbda勉強会
 
WUPC2nd A問題
WUPC2nd A問題WUPC2nd A問題
WUPC2nd A問題
 
Joi模擬予選2013 6番解説
Joi模擬予選2013 6番解説Joi模擬予選2013 6番解説
Joi模擬予選2013 6番解説
 
Four op
Four opFour op
Four op
 
Pyramid
PyramidPyramid
Pyramid
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
 
D : 解説
D : 解説D : 解説
D : 解説
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
競技プログラミングの楽しみ
競技プログラミングの楽しみ競技プログラミングの楽しみ
競技プログラミングの楽しみ
 
JOISS2015 グレブナー基底発表joisinoお姉ちゃんを救おう
JOISS2015 グレブナー基底発表joisinoお姉ちゃんを救おうJOISS2015 グレブナー基底発表joisinoお姉ちゃんを救おう
JOISS2015 グレブナー基底発表joisinoお姉ちゃんを救おう
 
計算量
計算量計算量
計算量
 
公開鍵暗号(1): RSA暗号
公開鍵暗号(1): RSA暗号公開鍵暗号(1): RSA暗号
公開鍵暗号(1): RSA暗号
 

Viewers also liked

Spam
SpamSpam
Apresentação Corporativa VIBROPAC 2017
Apresentação Corporativa VIBROPAC 2017Apresentação Corporativa VIBROPAC 2017
Apresentação Corporativa VIBROPAC 2017
Vibropac
 
Class 9 Cbse Maths Question Paper
Class 9 Cbse Maths Question PaperClass 9 Cbse Maths Question Paper
Class 9 Cbse Maths Question Paper
Sunaina Rawat
 
Orientações para salmistas
Orientações para salmistasOrientações para salmistas
Orientações para salmistas
Paróquia Nossa Senhora das Mercês
 
Catálogo de Retentores Sabó
Catálogo de Retentores SabóCatálogo de Retentores Sabó
Catálogo de Retentores Sabó
Fernando Santos
 
Área de transferência do windows 7
Área de transferência do windows 7Área de transferência do windows 7
Área de transferência do windows 7
Matheus Araújo
 
Outlook básico - Aula 1
Outlook básico - Aula 1Outlook básico - Aula 1
Outlook básico - Aula 1
Khyquer Ronaldy
 
Treinamento em microsoft outlook 2010
Treinamento em microsoft outlook 2010Treinamento em microsoft outlook 2010
Treinamento em microsoft outlook 2010
Denis Katko
 
Apostila motores-de-combustao-interna
Apostila motores-de-combustao-internaApostila motores-de-combustao-interna
Apostila motores-de-combustao-interna
tabVlae
 
Texto SAVIANI Concepções Pedagógicas
Texto SAVIANI Concepções PedagógicasTexto SAVIANI Concepções Pedagógicas
Texto SAVIANI Concepções Pedagógicas
Débora Silveira
 

Viewers also liked (10)

Spam
SpamSpam
Spam
 
Apresentação Corporativa VIBROPAC 2017
Apresentação Corporativa VIBROPAC 2017Apresentação Corporativa VIBROPAC 2017
Apresentação Corporativa VIBROPAC 2017
 
Class 9 Cbse Maths Question Paper
Class 9 Cbse Maths Question PaperClass 9 Cbse Maths Question Paper
Class 9 Cbse Maths Question Paper
 
Orientações para salmistas
Orientações para salmistasOrientações para salmistas
Orientações para salmistas
 
Catálogo de Retentores Sabó
Catálogo de Retentores SabóCatálogo de Retentores Sabó
Catálogo de Retentores Sabó
 
Área de transferência do windows 7
Área de transferência do windows 7Área de transferência do windows 7
Área de transferência do windows 7
 
Outlook básico - Aula 1
Outlook básico - Aula 1Outlook básico - Aula 1
Outlook básico - Aula 1
 
Treinamento em microsoft outlook 2010
Treinamento em microsoft outlook 2010Treinamento em microsoft outlook 2010
Treinamento em microsoft outlook 2010
 
Apostila motores-de-combustao-interna
Apostila motores-de-combustao-internaApostila motores-de-combustao-interna
Apostila motores-de-combustao-interna
 
Texto SAVIANI Concepções Pedagógicas
Texto SAVIANI Concepções PedagógicasTexto SAVIANI Concepções Pedagógicas
Texto SAVIANI Concepções Pedagógicas
 

Similar to Sanpo

Ninja of Train
Ninja of TrainNinja of Train
Ninja of Train
tomerun
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programming
Keisuke OTAKI
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
AtCoder Inc.
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説
AtCoder Inc.
 
Kosakunakano
KosakunakanoKosakunakano
Kosakunakano
ssuserb09fbd
 
TopCoder SRM614 解説
TopCoder SRM614 解説TopCoder SRM614 解説
TopCoder SRM614 解説
EmKjp
 
Permutation
PermutationPermutation
Permutation
oupc
 
Infinite SVM [改] - ICML 2011 読み会
Infinite SVM [改] - ICML 2011 読み会Infinite SVM [改] - ICML 2011 読み会
Infinite SVM [改] - ICML 2011 読み会
Shuyo Nakatani
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
tmaehara
 
Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会
Shuyo Nakatani
 

Similar to Sanpo (12)

Ninja of Train
Ninja of TrainNinja of Train
Ninja of Train
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programming
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説
 
Kosakunakano
KosakunakanoKosakunakano
Kosakunakano
 
TopCoder SRM614 解説
TopCoder SRM614 解説TopCoder SRM614 解説
TopCoder SRM614 解説
 
Permutation
PermutationPermutation
Permutation
 
Infinite SVM [改] - ICML 2011 読み会
Infinite SVM [改] - ICML 2011 読み会Infinite SVM [改] - ICML 2011 読み会
Infinite SVM [改] - ICML 2011 読み会
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会
 

More from oupc

Comment
CommentComment
Comment
oupc
 
Trip
TripTrip
Trip
oupc
 
Kth
KthKth
Kth
oupc
 
Cube
CubeCube
Cube
oupc
 
One
OneOne
One
oupc
 
Magical
MagicalMagical
Magical
oupc
 
Replace
ReplaceReplace
Replace
oupc
 
Goto
GotoGoto
Goto
oupc
 
Paren
ParenParen
Paren
oupc
 
Palin
PalinPalin
Palin
oupc
 
Sort
SortSort
Sort
oupc
 
Sharp2sat
Sharp2satSharp2sat
Sharp2sat
oupc
 
Segpair
SegpairSegpair
Segpair
oupc
 
Rmq
RmqRmq
Rmq
oupc
 
Knapsack
KnapsackKnapsack
Knapsack
oupc
 
Game
GameGame
Game
oupc
 
Divisor
DivisorDivisor
Divisor
oupc
 
Division
DivisionDivision
Division
oupc
 
Anagram
AnagramAnagram
Anagram
oupc
 

More from oupc (20)

Comment
CommentComment
Comment
 
Trip
TripTrip
Trip
 
Kth
KthKth
Kth
 
Cube
CubeCube
Cube
 
One
OneOne
One
 
Magical
MagicalMagical
Magical
 
Replace
ReplaceReplace
Replace
 
Goto
GotoGoto
Goto
 
Paren
ParenParen
Paren
 
Palin
PalinPalin
Palin
 
Sort
SortSort
Sort
 
Sharp2sat
Sharp2satSharp2sat
Sharp2sat
 
Segpair
SegpairSegpair
Segpair
 
Rmq
RmqRmq
Rmq
 
Knapsack
KnapsackKnapsack
Knapsack
 
Game
GameGame
Game
 
Divisor
DivisorDivisor
Divisor
 
Division
DivisionDivision
Division
 
Anagram
AnagramAnagram
Anagram
 
A
AA
A
 

Sanpo

  • 1. さんぽ 原案 : komiya, fura2 解答 : komiya, fura2 解説 : fura2
  • 2. 問題概要 ● N 頂点の木がある ● 辺 i を通ると、m_i 回目までの通行ではスコア v_i が得られる。m_i+1 回目以降は何も得られない ● また、辺 i には通行に必要なコスト t_i がある ● 頂点 1 からはじまり頂点 1 で終わるような、合計コ スト T 以下のウォークで、得られるスコアの合計を 最大化せよ
  • 3. 例 T=15 1 1/10 3/1 2 5 8/777 3/1 4 3 (コスト/☆の価値)
  • 4. 例 ● 答えは 10 + 10 + 10 + 1 + 1 = 32 T=15 1 1/10 3/1 2 5 8/777 3/1 4 3 (コスト/☆の価値)
  • 5. 解法 ● DP です – 以下、詳しく説明します ● 当分の間、説明を簡単にするため、m_i は正の偶数で あるとします
  • 6. 解法 ● 考えやすくするため、木を列にしておく – 根から DFS して、頂点を通った順に並べる。(Euler tour technique) 1 2 5 4 3 1 2 3 2 1 4 1 5 1
  • 7. 解法 ● さっきの列を a[1], a[2], … とする ● dp[i][w] := ( a[i] まで見ていて、ここまでの コストが w であるときの最大価値 ) – ただし、行きに往復分のコストを払い、帰りはコスト 0 と 思う
  • 8. 解法 ● DP の遷移は ( a[i-1] → a[i] が下りの辺のとき ) dp[i][w] := max(dp[prev[i]][w], max{ dp[i-1][w-c*t_i]+c*v_i | c=2,4,…,m_i } ) ● ここで、 – prev[i] := ( j < i かつ a[i] == a[j] となる最大の j ) – t_i := ( 辺 a[i-1] → a[i] のコスト ) – m_i := ( 辺 a[i-1] → a[i] の価値が得られる回数の上限 ) – v_i := ( 辺 a[i-1] → a[i] の価値 )
  • 9. 解法 dp[i][w] := max(dp[prev[i]][w], max{ dp[i-1][w-c*t_i]+c*v_i | c=2,4,…,m_i } ) ● 部分木 a[prev[i]], …, a[i-1] を無視することを表す 遷移
  • 10. 解法 dp[i][w] := max(dp[prev[i]][w], max{ dp[i-1][w-c*t_i]+c*v_i | c=2,4,…,m_i } ) ● 辺 a[i-1] → a[i] を c/2 回往復することを表す遷移
  • 11. 解法 ● 以上を素直に実装すると、O(NTM) かかり、TLE し てしまう – M := max{ m_1, m_2, …, m_{N-1} } ● DP の更新式 dp[i][w] := max(dp[prev[i]][w], max{ dp[i-1][w-c*t_i]+c*v_i | c=2,4,…,m_i } ) をよく見てみると...
  • 12. 解法 ● ナップザック問題の DP と同じだ! – しかも c=2,4,…,m_i なので、これは個数制限つ きナップザック ● 個数制限つきナップザックの高速化はよく知られて います – m_i を 2, 4, 8, … と O(log m_i) 個に分割する – あるいは、スライド最小値を使う  どちらも蟻本に載っています
  • 13. 解法 ● というわけで、 ● さっきの DP は O(NT log M) または O(NT) で計 算できます ● これで間に合う
  • 14. コーナーケース ● m_i が奇数のときは、全部の☆を拾うケースがあ るので、DP の遷移がひとつ増える。( サンプルに あります ) ● m_i = 0 のときは、☆を拾わずに i を進める遷移が 増える
  • 15. 提出状況 ● AC Rate – 20.00 % (1/5) ● First Acceptance – Onsite: magyorin (269 min) – All: magyorin (269 min)