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
0
220
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
670
JOI2015-2016 春合宿 day 2 Sandwich 解説
snuke
0
290
JOI2014 春合宿 day 2 スタンプラリー 解説
snuke
0
190
NPCA合宿きょーぷろ講義
snuke
0
360
JOI 2013 春合宿 day4-1 messenger 解説
snuke
0
350
CodeForces#162 Div1-E
snuke
0
300
CodeForces162 Div1-E
snuke
3
15k
SRM 555 Div 1 easy, Div 2 medium
snuke
1
430
SRM 555 Div 1 hard
snuke
1
500
Other Decks in Programming
See All in Programming
Multi Step Form, Decentralized Autonomous Organization
pumpkiinbell
1
810
Software Architecture
hschwentner
6
2.1k
Serverless Rust: Your Low-Risk Entry Point to Rust in Production (and the benefits are huge)
lmammino
1
140
『GO』アプリ バックエンドサーバのコスト削減
mot_techtalk
0
150
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
8
1.8k
富山発の個人開発サービスで日本中の学校の業務を改善した話
krpk1900
5
390
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
250
データの整合性を保つ非同期処理アーキテクチャパターン / Async Architecture Patterns
mokuo
53
18k
クリーンアーキテクチャから見る依存の向きの大切さ
shimabox
4
880
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
1
210
Rails アプリ地図考 Flush Cut
makicamel
1
130
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
200
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Agile that works and the tools we love
rasmusluckow
328
21k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
9
500
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Become a Pro
speakerdeck
PRO
26
5.1k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
100
18k
The Cost Of JavaScript in 2023
addyosmani
47
7.3k
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 だったときとの差分を計算してやると良良い