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
JOI2013 本選1 Illumination 解説
Search
kagamiz
March 29, 2013
Programming
390
0
Share
JOI2013 本選1 Illumination 解説
OkNCT-ICT 2013 春合宿 Day 5 (らしい) で解説したもの.
kagamiz
March 29, 2013
More Decks by kagamiz
See All by kagamiz
KCS v2. の開発
kagamiz
0
280
internship final presentation
kagamiz
0
1.3k
internship-middle term presentation
kagamiz
0
1.2k
すうがくのまほう
kagamiz
0
370
ご当地料理の紹介
kagamiz
0
490
オンラインジャッジシステムの実装
kagamiz
0
1.2k
AOJ 0022 Maximum Sum Sequence 解説
kagamiz
1
1.6k
AOJ 0557 A First Grader 解説
kagamiz
0
1k
AOJ 0186 Aizu Chicken 解説
kagamiz
0
330
Other Decks in Programming
See All in Programming
Don't Prompt Harder, Structure Better
kitasuke
0
780
実践CRDT
tamadeveloper
0
590
クラウドネイティブなエンジニアに向ける Raycastの魅力と実際の活用事例
nealle
2
210
[RubyKaigi 2026] Require Hooks
palkan
1
220
YJITとZJITにはイカなる違いがあるのか?
nakiym
0
240
Kingdom of the Machine
yui_knk
2
740
VueエンジニアがReactを触って感じた_設計の違い
koukimiura
0
180
属人化しないコード品質の作り方_2026.04.07.pdf
muraaano
0
220
10 Tips of AWS ~Gen AI on AWS~
licux
5
430
第3木曜LT会 #28
tinykitten
PRO
0
110
ふりがな Deep Dive try! Swift Tokyo 2026
watura
0
230
AI時代のエンジニアリングの原則 / Engineering Principles in the AI Era
haru860
0
570
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9k
Color Theory Basics | Prateek | Gurzu
gurzu
0
290
Building Adaptive Systems
keathley
44
3k
For a Future-Friendly Web
brad_frost
183
10k
Navigating Team Friction
lara
192
16k
Everyday Curiosity
cassininazir
0
200
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.2k
Accessibility Awareness
sabderemane
1
100
Ethics towards AI in product and experience design
skipperchong
2
260
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
270
Typedesign – Prime Four
hannesfritz
42
3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
JOI 2013 本選 1 Illumination 解説 @kagamiz
問題の概要 • 白黒で , 長さが N の電飾があります . ◦◦••◦•◦◦◦• •
ある区間を反転させて ( 反転させなくても良 い ), できるだけ長い交互列 ( 隣同士の色が 違う区間 ) を作りたい .
問題例の復習 ◦◦••◦•◦◦◦• ← これを長くしたい ◦◦•◦•◦•◦◦• • こう反転させると長さが 7 の交互列になる . ◦◦••◦•◦•◦•
• こうしても良い .
解答に移る前に • コンピュータはぱない機械ですが , 神では無 いので 1 秒あたりに処理できる命令に限度 があります .
• あるアルゴリズムで問題を解こうと考えたと きに , そのために必要な処理の回数を計算 量と言います ( 正確な定義ではない ).
アルゴリズムの計算量 • 計算量は , 通常「何に比例するか」で考えて , それをアルゴリズムのオーダーという . • 最初のうちはプログラム中のループの個数を
数えることが多く , たとえばループが 3 重 になっている箇所があれば O(N^3) 時間の アルゴリズムという .
アルゴリズムの計算量 • 計算量は , 通常「何に比例するか」で考えて , それをアルゴリズムのオーダーという . • アルゴリズムのオーダーが分かれば
, O(f(N)) の N に実際に N の最大値を入れてみて , 時間制限に間に合うか考えてみる . • 1 秒制限で f(N) ≦ 10^7 位なら大体 OK.
O(N^3) 時間のアルゴリズム • ◦◦••◦•◦◦◦• • 実際に切る場所を , 2 重ループで 2
つ決め打 ち . ← O(N^2) • その後に , その区間を反転して , 交互列の長 さの最大値を探す .← O(N) • 3 重ループなので合計 O(N^3).
O(N^3) 時間のアルゴリズム • 区間の反転は? • 前もって反転した配列を用意すると楽 .
( ^o^) 区間の反転はできた
( ^o^) 区間の反転はできた • ( ⊖ ) ˘ ˘ 。
o( 交互列の長さの最大値は? )
( ^o^) 区間の反転はできた • ( ⊖ ) ˘ ˘ 。
o( 交互列の長さの最大値は? ) • |JOI2013 本選 コード [ 検索 ]| ┗(☋ ` )┓ 三
( ^o^) 区間の反転はできた • ( ⊖ ) ˘ ˘ 。
o( 交互列の長さの最大値は? ) • |JOI2013 本選 コード [ 検索 ]| ┗(☋ ` )┓ 三 • ( ) Run-Length ◠‿◠ ☛ 圧縮の応用じゃ w
( ^o^) 区間の反転はできた • ( ⊖ ) ˘ ˘ 。
o( 交互列の長さの最大値は? ) • |JOI2013 本選 コード [ 検索 ]| ┗(☋ ` )┓ 三 • ( ) Run-Length ◠‿◠ ☛ 圧縮の応用じゃ w • ▂▅▇█▓▒░(’ω’) █▇▅▂ ░▒▓ うわあああ
交互列の長さを求める • Run-Length 圧縮では , となりと同じならま とめる , 違ったら新しく始める ,
といった 感じで縮約していったが , 今回はその逆 . • となりと違ったらまとめる , 同じだったら新 しく始める .
交互列の長さを求める • となりと違ったらまとめる , 同じだったら新 しく始める . • 擬似コード for
( すべての電飾 ) : if ( 前の電飾と違う色 ) then 長さ = 長さ +1 else 長さを配列に格納 . 長さ = 1. 長さを配列に格納 .
O(N^3) 時間のアルゴリズム • 結局何点とれるの? • 最悪 (10^5)^3 = 10^15. •
10^15?? • 10^15[msec] = 31709.7919838 年 ... • やばい (20 点が得られる )
O(N) 時間のアルゴリズム ◦|◦•|•◦•◦|◦|◦• • よくみてみよう
O(N) 時間のアルゴリズム ◦|◦•|•◦•◦|◦|◦• • 実際にひっくり返さなくても
O(N) 時間のアルゴリズム ◦|◦•|•◦•◦|◦|◦• • 隣り合う線に挟まる区間をひっくり返すと良 い!! ( 隣り合わない区間をひっくり返し ても ...
死 )
O(N) 時間のアルゴリズム ◦|◦•|•◦•◦|◦|◦• • 隣り合う 3 つの区間を考えて , 間をひっくり 返せば交互列
. やったぜ . • 3 つも区間が無いときはうしろに 2 つ なが さ 0 の区間を入れると考えやすい .
O(N) 時間のアルゴリズム • まとめ for ( すべての電飾 ) : if
( 前の電飾と違う色 ) then 長さ = 長さ +1 else 長さを配列に格納 . 長さ = 1. 長さを配列に格納 . • これをする ( 長さ 0 を 2 つ足すと good) • 配列の隣り合う 3 つの和の最大値が答え .
O(N) 時間のアルゴリズム • O(N) 時間で働く . 実装も綺麗 . • 10^2[msec]
= 100msec = 0.1s ( 実際はもっと 早いくらい ). • 文化祭もうまくいきそう . 100 点
ちなみに ◦◦••◦•◦◦◦• • 偶数番目をひっくり返すと ◦••◦◦◦◦•◦◦ • Run-Length して 3 つの区間和を求めるだけ