Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JOI2015-2016 春合宿 day 2 Sandwich 解説
Search
snuke
March 21, 2016
Education
0
300
JOI2015-2016 春合宿 day 2 Sandwich 解説
おからは栄養"満点"らしいです。
snuke
March 21, 2016
Tweet
Share
More Decks by snuke
See All by snuke
puzzleLT.pdf
snuke
0
700
JOI2015-sp-day4-walls-anothersolution
snuke
0
230
JOI2014 春合宿 day 2 スタンプラリー 解説
snuke
0
200
NPCA合宿きょーぷろ講義
snuke
0
360
JOI 2013 春合宿 day4-1 messenger 解説
snuke
0
360
CodeForces#162 Div1-E
snuke
0
330
CodeForces162 Div1-E
snuke
3
16k
SRM 555 Div 1 easy, Div 2 medium
snuke
1
450
SRM 555 Div 1 hard
snuke
1
540
Other Decks in Education
See All in Education
Pythonパッケージ管理 [uv] 完全入門
mickey_kubo
23
24k
情報科学類で学べる専門科目38選
momeemt
0
580
2025年度春学期 統計学 第14回 分布についての仮説を検証する ー 仮説検定(1) (2025. 7. 10)
akiraasano
PRO
0
140
生態系ウォーズ - ルールブック
yui_itoshima
1
250
”育てる”から”育つ”仕組みへ!スクラムによる新入社員教育
arapon
0
140
Tutorial: Foundations of Blind Source Separation and Its Advances in Spatial Self-Supervised Learning
yoshipon
1
150
社外コミュニティの歩き方
masakiokuda
2
190
H5P-työkalut
matleenalaakso
4
40k
Transición del Management al Neuromanagement
jvpcubias
0
210
日本の情報系社会人院生のリアル -JAIST 修士編-
yurikomium
1
120
Avoin jakaminen ja Creative Commons -lisenssit
matleenalaakso
0
2k
2025/06/05_読み漁り学習
nag8
0
190
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1032
460k
Into the Great Unknown - MozCon
thekraken
40
2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.5k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
112
20k
Writing Fast Ruby
sferik
628
62k
Automating Front-end Workflow
addyosmani
1370
200k
Mobile First: as difficult as doing things right
swwweet
224
9.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
Faster Mobile Websites
deanohume
309
31k
Transcript
サンドイッチ (Sandwich) 解説 JOI 2016 春合宿 day2 snuke
問題概要 • R⾏行行C列列のマス⽬目にサンドイッチが並んでいる • 斜辺または他の⼆二辺が空いてるサンドイッチは取れる • 各マスについて、そのマスのサンドイッチを両⽅方取るた めに取る必要のあるサンドイッチの個数の最⼩小値は?
問題概要 • R⾏行行C列列のマス⽬目にサンドイッチが並んでいる • 斜辺または他の⼆二辺が空いてるサンドイッチは取れる • 各マスについて、そのマスのサンドイッチを両⽅方取るた めに取る必要のあるサンドイッチの個数の最⼩小値は?
問題概要 • R⾏行行C列列のマス⽬目にサンドイッチが並んでいる • 斜辺または他の⼆二辺が空いてるサンドイッチは取れる • 各マスについて、そのマスのサンドイッチを両⽅方取るた めに取る必要のあるサンドイッチの個数の最⼩小値は?
問題概要 • R⾏行行C列列のマス⽬目にサンドイッチが並んでいる • 斜辺または他の⼆二辺が空いてるサンドイッチは取れる • 各マスについて、そのマスのサンドイッチを両⽅方取るた めに取る必要のあるサンドイッチの個数の最⼩小値は?
問題概要 • R⾏行行C列列のマス⽬目にサンドイッチが並んでいる • 斜辺または他の⼆二辺が空いてるサンドイッチは取れる • 各マスについて、そのマスのサンドイッチを両⽅方取るた めに取る必要のあるサンドイッチの個数の最⼩小値は?
問題概要 • R⾏行行C列列のマス⽬目にサンドイッチが並んでいる • 斜辺または他の⼆二辺が空いてるサンドイッチは取れる • 各マスについて、そのマスのサンドイッチを両⽅方取るた めに取る必要のあるサンドイッチの個数の最⼩小値は?
問題概要 • R⾏行行C列列のマス⽬目にサンドイッチが並んでいる • 斜辺または他の⼆二辺が空いてるサンドイッチは取れる • 各マスについて、そのマスのサンドイッチを両⽅方取るた めに取る必要のあるサンドイッチの個数の最⼩小値は?
問題概要 • R⾏行行C列列のマス⽬目にサンドイッチが並んでいる • 斜辺または他の⼆二辺が空いてるサンドイッチは取れる • 各マスについて、そのマスのサンドイッチを両⽅方取るた めに取る必要のあるサンドイッチの個数の最⼩小値は?
問題概要 • R⾏行行C列列のマス⽬目にサンドイッチが並んでいる • 斜辺または他の⼆二辺が空いてるサンドイッチは取れる • 各マスについて、そのマスのサンドイッチを両⽅方取るた めに取る必要のあるサンドイッチの個数の最⼩小値は?
問題概要 • R⾏行行C列列のマス⽬目にサンドイッチが並んでいる • 斜辺または他の⼆二辺が空いてるサンドイッチは取れる • 各マスについて、そのマスのサンドイッチを両⽅方取るた めに取る必要のあるサンドイッチの個数の最⼩小値は?
⼩小課題 1 (35点) • ⽬目的の2個のサンドイッチの取り⽅方は2通りある (A) 上側のサンドイッチを先にとって下側を次に取る (B) 下側のサンドイッチを先にとって上側を次に取る •
(A)についての最⼩小値が求められれば、(B)についても同 様な⽅方法で求めることができるので、(A)のみを考える 先 後
⼩小課題 1 (35点) • 上側のサンドイッチを取るためには、⾚赤マルの位置のサ ンドイッチを先に取らなければならない • このように「Xを取るためには先にYを取らなければい けない」という状況を、「XがYに依存している」と呼 ぶことにする
先 後
⼩小課題 1 (35点) • XがYに依存しているとき、X→Yという辺を貼ってみる • 辺が貼られたものを逆順に、取れるものから取っていけ ば緑のサンドイッチを取ることができる
⼩小課題 1 (35点) • このようにサイクルができる場合は取ることが出来ない
⼩小課題 1 (35点) • 各マスについて、(A),(B)パターンを試す – 依存関係を列列挙していき、辺を貼る – 辺が貼られたサンドイッチの個数を求める –
ただし、サイクルが存在する場合は取れないと判定する • 計算量量:O((RC)^2)
⼩小課題 1 (35点) • 具体的にどう計算するか – 単にbool visited[MAX_̲V]のような配列列で状態を管理理している と、「サイクル」なのか「単に2回訪れただけ」なのかが判定 できない
⼩小課題 1 (35点) • 具体的にどう計算するか – DFSを⽤用いると簡潔に実装できる int state[MAX_V]; //
0 で初期化 int dfs(int v) { if (state[v] == 1) return INF; if (state[v] == 2) return 0; state[v] = 1; int sum = 1; for (int u : to[v]) { int res = dfs(u); if (res == INF) return INF; sum += res; } state[v] = 2; return sum; }
実装の簡略略化 • サンドイッチが三⾓角形なのは扱いにくいので、マス単位 で考えることにする
実装の簡略略化 • サンドイッチが三⾓角形なのは扱いにくいので、マス単位 で考えることにする
実装の簡略略化 • マス⽬目の隣隣接関係を扱うときのテクニック – dx[] = {-‐‑‒1, 0, 1, 0},
dy[] = {0,-‐‑‒1,0,1} – for(v=0~∼3) nx = x+dx[v], ny = y+dy[v] • v という⽅方向でʻ‘Zʼ’のマスに⼊入ってきた時、そのマスから 貼る辺は v と v xor 1 の⽅方向のマス – ʻ‘Nʼ’のマスなら v と v xor 3 0 2 1 3
⼩小課題 2 (満点) • 列列ごとに考える • 列列の上から順に依存関係を計算していく
⼩小課題 2 (満点) • 列列ごとに考える • 列列の上から順に依存関係を計算していく
⼩小課題 2 (満点) • 列列ごとに考える • 列列の上から順に依存関係を計算していく
⼩小課題 2 (満点) • 列列ごとに考える • 列列の上から順に依存関係を計算していく • 依存関係の辺は単調増加!
⼩小課題 2 (満点) • 列列ごとに考える • 列列の上から順に依存関係を計算していく • 依存関係の辺は単調増加! –
上側のサンドイッチは必ず上⽅方向に依存しており、 上⽅方向に依存されたマスは上⽅方向に依存しているため
⼩小課題 2 (満点) • 列列ごとに、上から順に依存関係を計算する • 同じ列列内では依存関係を初期化をせずに計算していく • 依存関係の個数は⾼高々O(RC)なので、列列ごとにO(RC)で 計算でき、全体でO(RC*C)となる
⼩小課題 2 (満点) • 列列ごとに、上から順に依存関係を計算する • 同じ列列内では依存関係を初期化をせずに計算していく • 依存関係の個数は⾼高々O(RC)なので、列列ごとにO(RC)で 計算でき、全体でO(RC*C)となる
統計 0 35 100 15 4 1
統計 0 35 100 菩提樹の⽊木の下で悟りを開くブッダのイラスト 15 4 1 巫⼥女女さんのイラスト おからのイラスト