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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
kagamiz
March 29, 2013
Programming
410
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JOI2013 本選1 Illumination 解説
OkNCT-ICT 2013 春合宿 Day 5 (らしい) で解説したもの.
kagamiz
March 29, 2013
More Decks by kagamiz
See All by kagamiz
KCS v2. の開発
kagamiz
0
290
internship final presentation
kagamiz
0
1.4k
internship-middle term presentation
kagamiz
0
1.2k
すうがくのまほう
kagamiz
0
380
ご当地料理の紹介
kagamiz
0
500
オンラインジャッジシステムの実装
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
340
Other Decks in Programming
See All in Programming
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
480
1B+ /day規模のログを管理する技術
broadleaf
0
130
Claude Team Plan導入・ガイド
tk3fftk
0
180
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
510
自作OSでスライド発表する
uyuki234
1
3.8k
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
260
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
110
スマートグラスで並列バイブコーディング
hyshu
0
290
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
170
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
390
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
55
10k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
630
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
390
Skip the Path - Find Your Career Trail
mkilby
1
170
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
340
30 Presentation Tips
portentint
PRO
1
350
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
300
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Context Engineering - Making Every Token Count
addyosmani
9
1k
ラッコキーワード サービス紹介資料
rakko
1
3.9M
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 つの区間和を求めるだけ