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
CodeForces#162 Div1-E
Search
snuke
January 20, 2013
Programming
0
270
CodeForces#162 Div1-E
CodeForces#162 Div1-E の解説
snuke
January 20, 2013
Tweet
Share
More Decks by snuke
See All by snuke
puzzleLT.pdf
snuke
0
640
JOI2015-2016 春合宿 day 2 Sandwich 解説
snuke
0
270
JOI2015-sp-day4-walls-anothersolution
snuke
0
210
JOI2014 春合宿 day 2 スタンプラリー 解説
snuke
0
190
NPCA合宿きょーぷろ講義
snuke
0
330
JOI 2013 春合宿 day4-1 messenger 解説
snuke
0
320
CodeForces162 Div1-E
snuke
3
14k
SRM 555 Div 1 easy, Div 2 medium
snuke
1
410
SRM 555 Div 1 hard
snuke
1
460
Other Decks in Programming
See All in Programming
メール認証とRuby
uvb_76
0
100
Some Quick Ideas To Improve Your Tests ( #jassttokyo )
teyamagu
PRO
2
1.9k
Deno に Web 標準 API を実装する / Implementing Web Standard API to Deno
petamoriken
0
310
CSRF対策のやり方、そろそろアップデートしませんか / Update your knowledge of CSRF protection
hiro_y
22
11k
Material 3で Material 2ぽい見た目にする
numeroanddev
2
220
オレオレkaggle開発環境に Formatter/Linter入れてみた
stgkrt
0
340
Sementic Kernelのネイティブ関数について
tomokusaba
0
780
RubyVM を PHP で実装する 〜Hello World を出力するまで〜
memory1994
PRO
1
460
Learning Ruby
okuramasafumi
5
370
MySQL のインデックスの種類をおさらいしよう! / overviewing indexes in MySQL
okashoi
0
160
ISUCONってなんだか難しそう……!!でも、初めてのISUCONにPHPで挑戦してきました!
kotomin_m
0
260
Flutterアプリを GitHub Actions & Xcode Cloud で社内配布する / Distribute Flutter apps internally
takasfz
0
120
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
50
8.5k
Six Lessons from altMBA
skipperchong
19
2.9k
Reflections from 52 weeks, 52 projects
jeffersonlam
343
19k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
67
38k
Done Done
chrislema
178
15k
Code Review Best Practice
trishagee
54
15k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
6
930
Teambox: Starting and Learning
jrom
126
8.3k
Side Projects
sachag
451
41k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
185
15k
Fashionably flexible responsive web design (full day workshop)
malarkey
397
65k
Transcript
CodeForces #162 Div1-E RodeSideTrees writer: snuke
֓ཁ 東西の道にそって木を植えたり切ったりするクエリ を処理し、各クエリ後に西→東方向のLISを求める 木は各クエリ前に1m ずつ伸びる 植える木の高さは10m 以下 切り倒す木は西から10本目以内 木の本数 N
≦ 10^5, クエリ数 M ≦ 2*10^5
۪ͳղ๏ 毎回 LIS を求める。 O(M N log N)となり、さすがに間に合わない。
ఆղ まず、木の成長を無視するために、 t 個目のクエリの時に植えられる木の高さを h から h-t に変換しておきます。 んで、木の(場所,高さ)を x-y平面上にぷろっとしてみる。
ఆղ ߴ͞ ॴ こんな感じ? すると・・・
ఆղ 常に右上方向に辿る最長経路がLISになってる! この場合、LISは赤いやつになります。 LISの普通の条件「hi < hi+1 」と暗黙の条件「xi < xi+1 」からくる特性
ߴ͞ ॴ
ఆղ さて、この問題におけるクエリは 下から10番目以内に木を追加 左から10番目以内の木を削除 と言い換えられます。 ߴ͞ ॴ
ఆղ とりあえず、各木に Longest Decreasing Subsequence の長さを記録することにしてみます。 図の木のところに LDS の長さを書き込んでみる。 木iの右上の領域中の最大値
+ 1 が 木iのところに書き込まれるシステムらしい。 ߴ͞ ॴ 1 1 1 2 2 3 4
ఆղ 各クエリを爆速で処理する方法を考えてみよう。 ある木の LDS には右上の領域にある木のみが影響を及ぼし、 左 or 下 にある木は影響を及ぼさないことを利用しよう。 ߴ͞
ॴ 1 1 1 2 2 3 4
ఆղ 植えるクエリ (下から10番目以内に木を追加) 植える木よりも低い木をいったん抜いて、 順番に植え直す。 ߴ͞ ॴ 1 1 1
2 2 3 4
ఆղ 切るクエリ (左から10番目以内の木を削除) 切る木よりも左の木をいったん抜いて、 切る木以外を順番に植え直す。 ߴ͞ ॴ 1 1 1
2 2 3 4
ఆղ さて、ここで必要になるデータ構造はなんでしょう? 2次元segtree? → 更新にO(log^2 N)かかり、しかも定数項重そうな ので多分TLEします。 ߴ͞ ॴ
1 1 1 2 2 3 4
ఆղ 植えるクエリの時には x 方向の1次元segtree 切るクエリの時には y 方向の1次元segtree だけしか必要ない! O(log N)しかも定数項軽め!
※ただし、ノードの更新は両方のsegtreeに適応しないといけません。 ߴ͞(y) ॴ (x) 1 1 1 2 2 3 4
O(N * 10 * log N) くらい ܭࢉྔ
作問するにあたってLISとちょっと 仲良くなれた気がする。 ご清聴(?)ありがとうございました! CF#162へのご参加ありがとうございました! ·ͱΊ ←twitter(@the_nikaidoes)ͷΞΠίϯ