Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JOI2015-sp-day4-walls-anothersolution
Search
snuke
May 02, 2015
Programming
0
240
JOI2015-sp-day4-walls-anothersolution
第14回情報オリンピック春合宿day4 Walls 別解
snuke
May 02, 2015
Tweet
Share
More Decks by snuke
See All by snuke
puzzleLT.pdf
snuke
0
720
JOI2015-2016 春合宿 day 2 Sandwich 解説
snuke
0
310
JOI2014 春合宿 day 2 スタンプラリー 解説
snuke
0
210
NPCA合宿きょーぷろ講義
snuke
0
360
JOI 2013 春合宿 day4-1 messenger 解説
snuke
0
370
CodeForces#162 Div1-E
snuke
0
340
CodeForces162 Div1-E
snuke
3
16k
SRM 555 Div 1 easy, Div 2 medium
snuke
1
460
SRM 555 Div 1 hard
snuke
1
560
Other Decks in Programming
See All in Programming
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
270
ハイパーメディア駆動アプリケーションとIslandアーキテクチャ: htmxによるWebアプリケーション開発と動的UIの局所的適用
nowaki28
0
430
TestingOsaka6_Ozono
o3
0
170
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
410
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
430
ELYZA_Findy AI Engineering Summit登壇資料_AIコーディング時代に「ちゃんと」やること_toB LLMプロダクト開発舞台裏_20251216
elyza
2
270
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
120
JETLS.jl ─ A New Language Server for Julia
abap34
1
420
20251127_ぼっちのための懇親会対策会議
kokamoto01_metaps
2
440
Integrating WordPress and Symfony
alexandresalome
0
160
チームをチームにするEM
hitode909
0
340
Microservices rules: What good looks like
cer
PRO
0
1.5k
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
Embracing the Ebb and Flow
colly
88
4.9k
How GitHub (no longer) Works
holman
316
140k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
2
240
30 Presentation Tips
portentint
PRO
1
160
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Music & Morning Musume
bryan
46
7k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.6k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Transcript
第14回情報オリンピック 春合宿 day4 Walls 別解解説 ⼆二階堂建⼈人(snuke)
⼩小課題2 最初、防壁の左端が全部 0
下ごしらえ 壁を⻑⾧長さでソートしておく
下ごしらえ どの時点でも⼭山型になっている (凹んでいたりしない)
レーザー レーザーが来た時は、 ・上 n 個を左揃え ・上 n 個を右揃え
のどちらかが起こる
レーザー レーザーが来た時は、 ・上 n 個を左揃え ・上 n 個を右揃え
のどちらかが起こる
レーザー レーザーが来た時は、 ・上 n 個を左揃え ・上 n 個を右揃え
のどちらかが起こる
segtree segtreeを作ってみる ノードに持たせる値は何にするか
ノードに持たせる値 とりあえず、state,pos を⽤用意する ・state = 1 なら、区間内の防壁がposで左揃えされている ・state
= 2 なら、区間内の防壁がposで右揃えされている ・state = -‐‑‒1 なら、区間は揃っていない (state,pos) = (-‐‑‒1,-‐‑‒1) 2,10 -‐‑‒1,-‐‑‒1 2,10 2,10 -‐‑‒1,-‐‑‒1 1,0 2,10 2,10 2,10 2,10 1,4 1,2 1,0 1,0
更更新⽅方法 state = 1 の場合(区間が全てposで左揃え) ・区間が全てpi で左揃えされる場合:普通に更更新 ・区間が全てpi
で右揃えされる場合:普通に更更新 ・区間が揃わない場合: stateを -‐‑‒1 にして、左の⼦子に潜り、 ・左の⼦子が揃わなかった場合:右の⼦子には潜らない ・左の⼦子が揃った場合:右の⼦子にも潜る (state = 2 の場合(区間が全てposで右揃え)も同様) =state,posの組が同じ
更更新⽅方法 state = -‐‑‒1 の場合(区間が揃っていない) ・左の⼦子に潜る ・左の⼦子が揃わなかった場合:右の⼦子には潜らない
・左の⼦子が揃った場合:右の⼦子にも潜る ・潜った後、 ・左右の⼦子が揃った場合:state,posを⼦子と同じにする ・左右の⼦子が揃わなかった場合:stateを-‐‑‒1にする
更更新⽅方法 state = 1 の場合(区間が全てposで左揃え) ・区間が全てpi で左揃えされる場合:普通に更更新 ・区間が全てpi
で右揃えされる場合:普通に更更新 ・区間が揃わない場合: stateを -‐‑‒1 にして、左の⼦子に潜り、 ・左の⼦子が揃わなかった場合:右の⼦子には潜らない ・左の⼦子が揃った場合:右の⼦子にも潜る → ノードに w =「区間内の防壁の⻑⾧長さの最⼤大」も 持たせておくとよい(⻑⾧長いのが揃えば短いのも揃う)
答えを求める 答えを求めるためには、 各ノードになにを持たせればいいか
各移動の⻑⾧長さ 左揃え → 左揃え(右揃え → 右揃え) p 移動量量:pos -‐‑‒
p pos wi
左揃え → 右揃え(右揃え → 左揃え) pos wi 各移動の⻑⾧長さ 移動量量:p
-‐‑‒ pos -‐‑‒ wi + 1 p
答えを求める ・pos -‐‑‒ p ・p -‐‑‒ pos -‐‑‒ wi
+ 1 をいくつか⾜足したものが答え 各防壁の答えは、 ・x + wi * y という形で表せそう
答えを求める segtreeの各ノードに、sum,cnt という値を持たせる 答えは「sumの和 + cntの和 * wi 」
更更新は ・左揃え→左揃え:sum += pos -‐‑‒ p ・左揃え→右揃え:sum += p -‐‑‒ pos + 1, cnt -‐‑‒= wi とすればいい
まとめ segtreeを作り、ノードには以下の値を持たせる ・state,pos:左揃い・右揃い・不不揃い、揃った場所 ・w:防壁の最⼤大⻑⾧長区間(全て揃うかを判定するため) ・sum,cnt:答えを計算するための値 更更新は、
・state,posを更更新するついでにsum,cntを更更新する ・state=1,2(揃っている)なら普通に更更新 ・state=-‐‑‒1(不不揃い)なら⼦子に潜る → 計算量量は?
計算量量 state = -‐‑‒1 の場合(区間が揃っていない) ・左の⼦子に潜る ・左の⼦子が揃わなかった場合:右の⼦子には潜らない
・左の⼦子が揃った場合:右の⼦子にも潜る ・潜った後、 ・左右の⼦子が揃った場合:state,posを⼦子と同じにする ・左右の⼦子が揃わなかった場合:stateを-‐‑‒1にする state = 1 の場合(区間が全てposで左揃え) ・区間が全てp i で左揃えされる場合:普通に更更新 ・区間が全てp i で右揃えされる場合:普通に更更新 ・区間が揃わない場合: stateを -‐‑‒1 にして、左の⼦子に潜り、 ・左の⼦子が揃わなかった場合:右の⼦子には潜らない ・左の⼦子が揃った場合:右の⼦子にも潜る (state = 2 の場合(区間が全てposで右揃え)も同様) ポイント ・state = -‐‑‒1 なら潜る ・stateによらず、まず左の⼦子に潜り、 ・左の⼦子が揃わなかった場合:右の⼦子には潜らない ・左の⼦子が揃った場合:右の⼦子にも潜る
計算量量 ⾚赤い線のようにsegtree上を動きます たくさんのノードを辿ることもありそうに⾒見見えます
計算量量 ◯で囲ったような部分、 つまり左も右もがっつり潜る部分の個数を x とすると、 O(x * segtreeの⾼高さ(=logN))
で抑えられそうです ※ここのように、潜った直後に帰ってくる場所は含まない
計算量量 ・◯で囲ったような部分のstateは -‐‑‒1 のはず
計算量量 ・右の⼦子にも潜るということは、左の⼦子は全部揃っている → ◯の部分で右に潜ったということは、 △のstateが -‐‑‒1 から
1 か 2 になる
計算量量 つまり左も右もがっつり潜る部分の個数を x とすると、 O(x * segtreeの⾼高さ=(logN)) で抑えられそうです
・潜るノードの個数が O(log N) 回増えるときは、 state=-‐‑‒1 のノードが 1 つ減る! ・さらに、stateが 1 か 2 から -‐‑‒1 になるノードは、1つの レーザーにつき、O(log N) 個 → そのような場所は、 i = iより左は全部揃い、iより右は揃わない というような i を含む区間のみ
計算量量 ・潜るノードの個数が O(log N) 回増えるときは、 必ず state=-‐‑‒1 のノードが 1
つ減る! ・さらに、stateが 1 か 2 から -‐‑‒1 になるノードは、1つの レーザーにつき、O(log N) 個 潜るノードの個数が増える回数 ≦ state=-‐‑‒1のノードが減る個数 state=-‐‑‒1のノードが減る個数 ≦ state=-‐‑‒1のノードが増える個数 state=-‐‑‒1のノードが増える個数 ≦ O(log N)*レーザーの個数 つまり、 潜るノードの個数が増える回数 ≦ O(log N)*レーザーの個数! → ならし計算量量が O(log^2 N) になった!
⼩小課題2 このように、 保留留した頂点を後で潜る、遅延更更新の発展系のような⼿手法 を使うと、O(M log^2 N) で解けた!
参考 http://snuke.hatenablog.com/entry/2014/08/02/202210
⼩小課題3 初期位置がめちゃくちゃなので、そのままだとダメ 初期位置が 0 だったときとの差分を計算してやると良良い