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
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
継続モナドとリアクティブプログラミング
yukikurage
3
400
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
14
6.7k
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
250
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
200
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
240
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
200
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
200
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
0
1.5k
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
160
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
440
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
270
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Crafting Experiences
bethany
1
210
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.7k
sira's awesome portfolio website redesign presentation
elsirapls
0
300
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Automating Front-end Workflow
addyosmani
1370
210k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
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 つの区間和を求めるだけ