Top Banner
難しい典型テクとか Slides for IOI2015 Japan Team
53

直前合宿 講義スライド

Aug 16, 2015

Download

Engineering

tozan gezan
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 直前合宿 講義スライド

難しい典型テクとか

Slides for IOI2015 Japan Team

Page 2: 直前合宿 講義スライド

注意事項

写真が入っていた空間には代わりに写真のURLを載せたので気分を楽しんでください。

Page 3: 直前合宿 講義スライド

Contents

・変なDPmongeとか

・分割統治

Page 4: 直前合宿 講義スライド

これらの手法の個人的イメージ

・典型テクではある

・とはいえ使いどころが非自明

・使う必要を出そうと思うと難しい問題になりがち

・なかなかこういう問題は作られない

・経験が積みにくい

Page 5: 直前合宿 講義スライド

これらの手法の個人的イメージ

・典型テクではある

・とはいえ使いどころが非自明

・中でやってることも単純じゃないことが多い

・なかなかこういう問題は作られない

・経験が積みにくい

練習しにくい二分探索的ポジション

Page 6: 直前合宿 講義スライド

Contents

・変なDPmongeとか

・分割統治

http://www.ioi-jp.org/ioi/2012/9-26/gardaland5.jpg

Page 7: 直前合宿 講義スライド

DP Optimization

読むべき資料(数式が苦手なので読めていない)・http://topcoder.g.hatena.ne.jp/spaghetti_source/20120915

・http://codeforces.com/blog/entry/8219

http://www.ioi-jp.org/ioi/2013/7-06/sydney1.jpg

Page 8: 直前合宿 講義スライド

Most Typical DP Optimization

一番多いパターンはこんな感じの

dp[i][j]=max{dp[i-1][k]+都合のよい関数}ただし、dp[i][j]を決めることになったkよりもdp[i][j+1]を決めることになったkが小さくはならない

→変な順でdpテーブルを埋めると計算量が落ちる

Page 9: 直前合宿 講義スライド

Telephone Wire (PKU 3612)

dp[i][j]=min{dp[i-1][k]+C×abs(j-k)+(h[i]-j)2}(j≧h[i]のみ埋める)

A[i][j]:= (dp[i][j]を決定付けるkの値)とすると A[i][j] ≦ A[i][j+1] が容易に想像つく

あと、凸性も持っている(…≧≧≧≧≦≦≦≦…みたいな感じ)

Page 10: 直前合宿 講義スライド

Telephone Wire (PKU 3612)

どういう方法で高速化できるか

・dp[i][j]を、dp[i-1][k]+C×abs(j-k)+(h[i]-j)2をkが小さい順に計算

・途中で一つ前より大きくなってしまったらやめる

・大きくなる前のkからdp[i][j+1]を計算

・以下繰り返し

Page 11: 直前合宿 講義スライド

514

j

k

Page 12: 直前合宿 講義スライド

514 114

j

k

Page 13: 直前合宿 講義スライド

514 114 810

j

k

Page 14: 直前合宿 講義スライド

514 114 810

364j

k

Page 15: 直前合宿 講義スライド

514 114 810

364 364j

k

Page 16: 直前合宿 講義スライド

514 114 810

364 364 334j

k

Page 17: 直前合宿 講義スライド

514 114 810

364 364 334 1919j

k

Page 18: 直前合宿 講義スライド

514 114 810

364 364 334 1919

893

j

k

Page 19: 直前合宿 講義スライド

514 114 810

364 364 334 1919

893 114514

j

k

Page 20: 直前合宿 講義スライド

514 114 810

364 364 334 1919

893 114514

33

j

k

Page 21: 直前合宿 講義スライド

514 114 810

364 364 334 1919

893 114514

33 4

j

k

Page 22: 直前合宿 講義スライド

514 114 810

364 364 334 1919

893 114514

33 4 1000000007

j

k

Page 23: 直前合宿 講義スライド

Sashimi (AOJ 2415)

・次の区間DPをO(N2)で全部埋めたい

dp[i][j]=mini≦k<j{dp[i][k]+dp[k][j]}+sum(i,j)

Page 24: 直前合宿 講義スライド

Sashimi (AOJ 2415)

数式がやってることをイメージする

dp[i][j]=mini≦k<j{dp[i][k]+dp[k][j]}+sum(i,j)iがi-1になったりjがj+1になったら最適にするkの値はどう変化するか?

A[i][j]:= (dp[i][k]+dp[k][j]を最小とするkの値)とするとA[i-1][j] ≦ A[i][j] ≦ A[i][j+1]が成り立ちそう(???????)

Page 25: 直前合宿 講義スライド

Sashimi (AOJ 2415)

数式がやってることをイメージする

dp[i][j]=mini≦k<j{dp[i][k]+dp[k][j]}+sum(i,j)iがi-1になったりjがj+1になったら最適にするkの値はどう変化するか?

A[i][j]:= (dp[i][k]+dp[k][j]を最小とするkの値)とするとA[i-1][j] ≦ A[i][j] ≦ A[i][j+1]が成り立ちそう(???????)

脳内でイメージしよう!

Page 26: 直前合宿 講義スライド

詳しい条件

ちなみにA[i-1][j] ≦ A[i][j] ≦ A[i][j+1]が成り立つ十分条件としては、

a≦b≦c≦dのとき、

・C[a][c]+C[b][d] ≦ C[a][d]+C[b][c]・C[b][c]≦C[a][d]が成り立つというものが有名

Page 27: 直前合宿 講義スライド

DPテーブルの更新の仕方

・dp[i][j]をj-iが小さい順に更新していく

・配列A[i][j]を別に用意する

・dp[i][i]=0, A[i][i]=iがスタート

Page 28: 直前合宿 講義スライド

0

1

2

3

i

j初期状態

Page 29: 直前合宿 講義スライド

0

1

2

3

i

j0≦k≦1を試す

Page 30: 直前合宿 講義スライド

0 0

1

2

3

i

j1≦k≦2を試す

Page 31: 直前合宿 講義スライド

0 0

1 2

2

3

i

j2≦k≦3を試す

Page 32: 直前合宿 講義スライド

0 0

1 2

2 2

3

i

j0≦k≦2を試す

Page 33: 直前合宿 講義スライド

0 0 1

1 2

2 2

3

i

j2≦k≦2を試す

Page 34: 直前合宿 講義スライド

0 0 1

1 2 2

2 2

3

i

j1≦k≦2を試す

Page 35: 直前合宿 講義スライド

0 0 1 1

1 2 2

2 2

3

i

j各j-iの値ごとにO(N)かかるので合計O(N2)

Page 36: 直前合宿 講義スライド

Buffed Buffet (ICPC WF2014 B)

N種類の食べ物があり、1個あたり重さwiで、k個目を食べたとき満足度はvi-(k-1)Δvi上昇する。

食べたものの重さの合計が0~wになるときのそれぞれの満足度の最大値を求めよ。

N≦250, W≦10,0000≦vi, Δvi

Page 37: 直前合宿 講義スライド

Buffed Buffet (ICPC WF2014 B)

dp[i][j]:=i種類目まで合計重さjのときの最大値

普通に計算するとO(NW2)で遅い

今まで見たとおり疑ってかかるべき点は

A[i][j]≦A[i][j+1]が成り立つかどうか

Page 38: 直前合宿 講義スライド

Buffed Buffet (ICPC WF2014 B)

左のような状況になり得ないことを示す必要がある

Page 39: 直前合宿 講義スライド

Buffed Buffet (ICPC WF2014 B)

このとき計算すると青より緑がより最適になるので矛盾する

(スライドにしにくい)

よって

A[i][j]≦A[i][j+1]

s t u v

Page 40: 直前合宿 講義スライド

A[i][j]

j

今までの結果から、jとA[i][j]の関係はたとえば左図のようになる。

Page 41: 直前合宿 講義スライド

A[i][j]

j

真ん中の行の最適値を求めてから左上と右下に分けて分割統治

Page 42: 直前合宿 講義スライド

A[i][j]

j

真ん中の最適値を求めてから左上と右下に分けて分割統治

灰色のところはもう計算しない

Page 43: 直前合宿 講義スライド

計算量

分割統治で細かい断片に分かれるが、

・k回分割した後の断片たちの計算が合計でO(N)・O(log N)回分割される

計O(N log N)で全体が更新できる

(この問題ならN回W個のものを更新するので

合計O(NW log W)になる)

Page 44: 直前合宿 講義スライド

Wombats (IOI 2013)

・(r0,i)→(r1,k), (r1,k)→(r2,j)の最短経路長がそれぞれ分かっているので合成して(r0,i)→(r2,j) の最短経路長全部をO(N2)で求める必要がある

・下から上に逆走できないのでこのアイデアが出る

http://www.ioi-jp.org/ioi/2013/7-11/zoo6.jpg

http://www.ioi-jp.org/ioi/2013/7-11/zoo5.jpg

Page 45: 直前合宿 講義スライド

Wombats (IOI 2013)今、上の始点を固定したr0

r1

r2

https://pbs.twimg.com/profile_images/462152269824139264/uvdKueHz.png

Page 46: 直前合宿 講義スライド

Wombats (IOI 2013)□に行く最善の方法で△を通るとき

r0

r1

r2

http://www.ioi-jp.org/ioi/2013/7-13/brisbane7.jpg

Page 47: 直前合宿 講義スライド

Wombats (IOI 2013)□を左にずらしたら△が右に移動したほうが小さくなるケースはあるか?

交差しているところをもうちょっと真面目に考える

r0

r1

r2

Page 48: 直前合宿 講義スライド

Wombats (IOI 2013)最低1箇所はクロスすることになる(共有部分は点だけかもしれないけど)赤い辺に着目すると緑の経路のほうがオレンジの経路よりコストが低い

Page 49: 直前合宿 講義スライド

Wombats (IOI 2013)青い辺に着目するとオレンジの経路のほうが緑の経路よりコストが低い

これはおかしいhttp://www.ioi-jp.org/ioi/2013/7-12/awarding5.jpg

Page 50: 直前合宿 講義スライド

Wombats (IOI 2013)下の点を固定しても同じことが言える

ということでA[i-1][j]≦A[i][j]≦A[i][j+1]ふたたび登場Sashimiと同様、i-jの昇順にテーブルを埋めていく

r0

r1

r2

Page 51: 直前合宿 講義スライド

注意

この問題ではTelephone Wireのような簡単な更新は不可能

なぜか?→≧≧≧≦≦≦≦≦の形になっていない

100 1001001

0 0 0

000

0 0 0 0

0 0 0

□から○までの最短経路を求めるときに1→100と悪くなったのでやめる↓0の経路がその後にあることを見逃す↓メダルが消える

Page 52: 直前合宿 講義スライド

練習問題

AOJ 2603 Time TableAOJ 2488 Tree Constructionさっきの2つのURLの先にもたくさん練習問題があります。

Page 53: 直前合宿 講義スライド

Conclusion

・DPで「最適を出すkの値が単調」みたいな場面に出くわしたら計算量が改善できることもしばしばある

・どういうパターンかはしっかり考察する必要がある

・あと(DPテーブルを変な順で埋めるだけあって)実装が一筋縄ではいかないので要練習