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-sp-day4-walls-anothersolution
Search
snuke
May 02, 2015
Programming
260
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JOI2015-sp-day4-walls-anothersolution
第14回情報オリンピック春合宿day4 Walls 別解
snuke
May 02, 2015
More Decks by snuke
See All by snuke
puzzleLT.pdf
snuke
0
740
JOI2015-2016 春合宿 day 2 Sandwich 解説
snuke
0
320
JOI2014 春合宿 day 2 スタンプラリー 解説
snuke
0
230
NPCA合宿きょーぷろ講義
snuke
0
370
JOI 2013 春合宿 day4-1 messenger 解説
snuke
0
390
CodeForces#162 Div1-E
snuke
0
360
CodeForces162 Div1-E
snuke
3
16k
SRM 555 Div 1 easy, Div 2 medium
snuke
1
470
SRM 555 Div 1 hard
snuke
1
590
Other Decks in Programming
See All in Programming
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.4k
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.6k
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
280
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
220
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
14
6.5k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
800
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
200
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
140
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
280
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
180
Featured
See All Featured
Paper Plane
katiecoart
PRO
1
52k
Documentation Writing (for coders)
carmenintech
77
5.4k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
170
Product Roadmaps are Hard
iamctodd
PRO
55
12k
The Curious Case for Waylosing
cassininazir
1
410
GitHub's CSS Performance
jonrohan
1033
470k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
870
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
180
Being A Developer After 40
akosma
91
590k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.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 だったときとの差分を計算してやると良良い