SlideShare a Scribd company logo
1 of 48
Download to read offline
導入 実装 応用 おわり
Convex Hull Trick
えび (rsk0315)
HCPC 春の勉強会 @ April 4, 2019
Convex Hull Trick rsk0315
導入 実装 応用 おわり
最近知ったこと (1/3)
最初に,えびちゃんが最近お勉強したことの紹介をします.
興味を持ったものがあったら実装してみてね.
フラクショナルカスケーディング
長さ k の sorted 配列 n 個に対して x を探す問題を考える.
愚直にやると O(n log k) のところを O(n + log k) にできる.
双対 LP
ある種の最適化問題を別の最適化問題に言いかえる.
最短路とか最小費用流とかに帰着されたりする.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
最近知ったこと (2/3)
非再帰セグ木
区間の不等号がどうこう,みたいなバグとばいばいできる.
配列長を 2 べきにしなくてもよい.
a[i] の取得を O(1) でできる.
遅延伝播もできる.
かっこいい.
HL 分解
木のパス上のクエリを高速に処理できる.
 
ブ ル ー フ カ
Bor˚uvka 法
最小全域木を求めるアルゴリズム.
各連結成分で最小コストの辺を選ぶのを繰り返す.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
最近知ったこと (3/3)
Lagrange 補間
n 次多項式 f について f(x0), f(x1), . . . , f(xn) が既知とする.
このとき,任意の x に対して f(x) を計算できる.
xi = i としておくと高速化が楽.
Tonelli–Shanks アルゴリズム
a, p に対して x2 ≡ a (mod p) なる x を求める.
p = (2q − 1) · 2S に対して O(S log S/ log log S).
Convex hull trick
直線群に関する特定のクエリを処理する.
今日はこれを紹介します.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
今日の流れ
Convex hull trick(以下 CHT)を以下の流れでお勉強します.
なにができるの?
どう実装するの?
どんな問題に応用できるの?
Convex Hull Trick rsk0315
導入 実装 応用 おわり
できる操作
xy-平面上の直線の集合 L に対して,次の操作を高速に行う.
集合に新たな直線を追加する.
L の直線のうち,与えられた座標 x での y の最小値を答える.
x
y
O
Convex Hull Trick rsk0315
導入 実装 応用 おわり
実装のやり方
大きく分けて以下の二つがありそう.
連想配列で処理するもの
✓ オンライン処理できる
× 実装を雑にやると log が二つつく
セグメント木で処理するもの
Li Chao (segment) tree とか呼ばれる
✓ 線分の追加もできるかも?
× オフライン処理しなきゃかも(クエリの先読み)
最小値クエリの x 座標(の候補)の数を N として
全体で O(N) 空間,クエリあたり O(log N) 時間かかる.
× 0 ⩽ x ⩽ 109 とかだとつらい.
✓ 0 ⩽ x ⩽ 105 とかならオンライン処理もできそう.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
重要な性質
x
y
O
最小値をとる部分について傾きが単調減少となる.
どの点においても最小値をとらない直線は無視してよい.
→ 無視できるかどうかの判定はどうしよう?
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ I
こういうのは帰納的に考えると楽で,base case は次の通り.
一本目の直線 → 常に必要.
二本目の直線
傾きが同じなら切片が大きい方は必要ない.
そうでなければ両方必要.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ II
次のような状況下で直線を追加することを考えるとよい.
不要な直線はすべて捨てられている.
必要な直線が二本以上存在する.
自明なケースの判定:
傾きが最小・最大の直線は常に必要.
x の絶対値が十分大きい点を考えよ.
傾きが同一の直線は切片が最小のもののみ必要.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ III
追加する直線 ℓ′ に対して,直線二本 ℓ1, ℓ2 を以下のように選ぶ:
傾き順で並ぶ直線群に ℓ′ を入れるときに ℓ′ をはさむ二直線.
!! 最小値をとる部分の傾きは単調減少
ℓ?, . . . , ℓ1, ℓ′, ℓ2, . . . , ℓ?.
e.g. 傾き {5, 4, 2, 1} の直線群に対して傾き 3 の直線 ℓ′ を追加する
→ ℓ1 は傾き 4,ℓ2 は傾き 2 の直線.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ IV
ℓ′ と ℓ1, ℓ2 の位置関係を調べる.
x
y
O
ℓ1 と ℓ2 の交点より上を ℓ′ が通る場合,ℓ′ は不要.
交点を通る場合も不要としてよい.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ IV
ℓ′ と ℓ1, ℓ2 の位置関係を調べる.
x
y
O
ℓ1 と ℓ2 の交点より下を ℓ′ が通る場合,ℓ′ は必要.
交点との ℓ′ との位置関係を調べる方法を考えればよい.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ V
ℓ1 : y = a1x + b1
ℓ2 : y = a2x + b2
ℓ′
: y = a′
x + b′
とすると,ℓ1, ℓ2 の交点 (xc, yc) は計算できる.
で,a′xc + b′ と yc の大小関係を考えるとよい.
結局,次の条件が成り立つとき ℓ′ は不要だとわかるはず.
不等号とか逆だったら許して.
(a′
− a2) · (b′
− b1) ⩾ (a1 − a′
) · (b2 − b′
).
簡単な式で判定できることだけわかってもらえたらいいです.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ VI
結局,追加クエリは次のように処理すればよい.
1. ℓ′ に対して前述の判定を行う.
→ 不要なら終了.必要なら ℓ′ を L に追加.
2. ℓ2 が不要になっていないか同様に判定し,不要なら消す.
2+. 必要な直線が見つかるまで ℓ2 を選び直し,消し続ける.
3. ℓ1 についても同様.
これをがんばって実装するとよいです.できますね.
ここからは最小値クエリを考えます.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
重要な性質
ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる.
x
y
傾き
y
Convex Hull Trick rsk0315
導入 実装 応用 おわり
重要な性質
ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる.
x
y
傾き
y
Convex Hull Trick rsk0315
導入 実装 応用 おわり
重要な性質
ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる.
x
y
傾き
y
Convex Hull Trick rsk0315
導入 実装 応用 おわり
重要な性質
ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる.
x
y
傾き
y
Convex Hull Trick rsk0315
導入 実装 応用 おわり
重要な性質
ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる.
x
y
傾き
y
Convex Hull Trick rsk0315
導入 実装 応用 おわり
重要な性質
ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる.
x
y
傾き
y
凸になっている!(この最小値がクエリの答え)
Convex Hull Trick rsk0315
導入 実装 応用 おわり
最小値クエリ
離散な凸関数の最小値は二分探索で求められる.
連想配列で直線を管理すると,ある点での値を計算しやすそう.
map[ 傾き ] → 切片
傾きの降順でソートして持っておくと追加が楽.
→ 平衡二分探索木ベースの連想配列(std::map)がよさそう.
各ステップで毎回連想配列から探すと O((log |L|)2) 時間.
→ 工夫してなんとかするとよさそう.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
限定された状況下での最適化
追加する直線の傾きが単調減少な場合
→ 挿入位置が常に末尾なので,std::vector とかでよい.
さらに最小値クエリが単調増加の場合
→ 古い直線から不要になっていく.std::deque が適役.
ならし O(1) 時間で各クエリを処理できる.わーい.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
補足(追記)
ある直線と,それが最小値をとる区間との対応付けを覚えておい
て処理する方法のが自然かも?
なんだけど,整数だと区間の端点を切り下げたり切り上げる必要
があって,これは C++の除算の仕様と気持ちが合わなくて無限に
バグらせがち.やめたい.やめてしまった.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
ひとやすみ
ここまでが連想配列ベースの実装.
ここからはセグメント木ベースの実装.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
実装方針
最小値クエリで聞かれる点 {x0, x1, . . . , xN−1} が既知とする.
各ノードはいくつかの点をカバーしていて,一つの直線を持つ.
直線群のうち xi での値が最小となる直線は,xi をカバーする
ノードのいずれかが持っているように保つ.
y = 0x + ∞ みたいな直線で初期化しておく.
{x0, x1, x2, x3, x4, x5, x6, x7}
{x0, x1, x2, x3} {x4, x5, x6, x7}
{x0, x1} {x2, x3} {x4, x5} {x6, x7}
{x0} {x1} {x2} {x3} {x4} {x5} {x6} {x7}
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ
根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ
と追加する直線 ℓ′ について,3 つの x 座標での値を比較する.
{x0, x1, . . . , x7} を例に考える.
x0 x4中間を選ぶ→ x7
両端点で下回っているなら ℓ を ℓ′ で置き換えて終了.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ
根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ
と追加する直線 ℓ′ について,3 つの x 座標での値を比較する.
{x0, x1, . . . , x7} を例に考える.
x0 x4中間を選ぶ→ x7
両端点で上回っているなら何もせず終了.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ
根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ
と追加する直線 ℓ′ について,3 つの x 座標での値を比較する.
{x0, x1, . . . , x7} を例に考える.
x0 x4中間を選ぶ→ x7
1 点で下回っているなら,下回っている方の子ノードを更新.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ
根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ
と追加する直線 ℓ′ について,3 つの x 座標での値を比較する.
{x0, x1, . . . , x7} を例に考える.
x0 x4中間を選ぶ→ x7
1 点で下回っているなら,下回っている方の子ノードを更新.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ
根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ
と追加する直線 ℓ′ について,3 つの x 座標での値を比較する.
{x0, x1, . . . , x7} を例に考える.
x0 x4中間を選ぶ→ x7
それ以外のとき,ℓ と ℓ′ を交換すると 1 点のパターンに帰着可能.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
追加クエリ
根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ
と追加する直線 ℓ′ について,3 つの x 座標での値を比較する.
{x0, x1, . . . , x7} を例に考える.
x0 x4中間を選ぶ→ x7
それ以外のとき,ℓ と ℓ′ を交換すると 1 点のパターンに帰着可能.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
最小値クエリ
作り方から明らか.
xi をカバーするノードを全部見る.
それらのノードの持つ直線の xi での値の最小値が答え.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
ひとやすみ
ここまでは実装の話.
ところで CHT はなんの名前なの? 概念? 実装?
??? : {CHT, Li Chao tree, . . . }
CHT : {Li Chao tree, . . . }
ハッシュは連想配列を指す用語ではない!(素振り)
で,ここからは応用の話.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
応用 – 例題
EDPC Z – Frog 3
N 個の足場があって,それぞれ高さは h1, h2, . . . , hN です.
足場 j から i へ跳ぶと,コスト (hi − hj)2 + C かかります.
足場 1 から N まで行くときの最小コストを求めてね.
1 ⩽ N ⩽ 2 × 105,1 ⩽ h1 < · · · < hN ⩽ 106,1 ⩽ C ⩽ 1012.
dp[i] = min
1⩽j<i
{dp[j] + (hi − hj)2
+ C}???
O(N2) かかって破滅では... ?
Convex Hull Trick rsk0315
導入 実装 応用 おわり
解説
展開してみる.
dp[i] = min
1⩽j<i
{dp[j] + h2
i − 2hihj + h2
j + C}
Convex Hull Trick rsk0315
導入 実装 応用 おわり
解説
展開してみる.
dp[i] = min
1⩽j<i
{dp[j] + h2
i − 2hihj + h2
j + C}
j から見た定数たちは外に出せる.
dp[i] = min
1⩽j<i
{dp[j] − 2hihj + h2
j } + h2
i + C
Convex Hull Trick rsk0315
導入 実装 応用 おわり
解説
展開してみる.
dp[i] = min
1⩽j<i
{dp[j] + h2
i − 2hihj + h2
j + C}
j から見た定数たちは外に出せる.
dp[i] = min
1⩽j<i
{dp[j] − 2hihj + h2
j } + h2
i + C
i に関してまとめてみる.
dp[i] = min
1⩽j<i
{(−2hj)hi + (dp[j] + h2
j )} + h2
i + C
ん?
Convex Hull Trick rsk0315
導入 実装 応用 おわり
遷移を眺める
dp[2] = min {(−2h1)h2 + (dp[1] + h2
1)} + h2
2 + C;
Convex Hull Trick rsk0315
導入 実装 応用 おわり
遷移を眺める
dp[2] = min {(−2h1)h2 + (dp[1] + h2
1)} + h2
2 + C;
dp[3] = min {(−2h1)h3 + (dp[1] + h2
1),
= (−2h2)h3 + (dp[2] + h2
2)} + h2
3 + C;
Convex Hull Trick rsk0315
導入 実装 応用 おわり
遷移を眺める
dp[2] = min {(−2h1)h2 + (dp[1] + h2
1)} + h2
2 + C;
dp[3] = min {(−2h1)h3 + (dp[1] + h2
1),
= (−2h2)h3 + (dp[2] + h2
2)} + h2
3 + C;
dp[4] = min {(−2h1)h4 + (dp[1] + h2
1),
= (−2h2)h4 + (dp[2] + h2
2),
= (−2h3)h4 + (dp[3] + h2
3)} + h2
4 + C;
Convex Hull Trick rsk0315
導入 実装 応用 おわり
遷移を眺める
dp[2] = min {(−2h1)h2 + (dp[1] + h2
1)} + h2
2 + C;
dp[3] = min {(−2h1)h3 + (dp[1] + h2
1),
= (−2h2)h3 + (dp[2] + h2
2)} + h2
3 + C;
dp[4] = min {(−2h1)h4 + (dp[1] + h2
1),
= (−2h2)h4 + (dp[2] + h2
2),
= (−2h3)h4 + (dp[3] + h2
3)} + h2
4 + C;
= ↑傾き ↑切片
Convex Hull Trick rsk0315
導入 実装 応用 おわり
遷移を眺める
dp[2] = min {(−2h1)h2 + (dp[1] + h2
1)} + h2
2 + C;
dp[3] = min {(−2h1)h3 + (dp[1] + h2
1),
= (−2h2)h3 + (dp[2] + h2
2)} + h2
3 + C;
dp[4] = min {(−2h1)h4 + (dp[1] + h2
1),
= (−2h2)h4 + (dp[2] + h2
2),
= (−2h3)h4 + (dp[3] + h2
3)} + h2
4 + C;
= ↑傾き ↑切片
dp[i] では,x = hi における直線群の最小値を求めている!
→ CHT で求められる!
Convex Hull Trick rsk0315
導入 実装 応用 おわり
まとめ
一般に,以下のような遷移をする DP に対して強気になれる.
dp[i] := min
1⩽j<i
{p(j)q(i) + r(j)} + s(i)
i = 2, . . . , N に対して次の処理をすればよい.
1. 直線 y = p(i − 1) · x + r(i − 1) を追加する.
2. 直線群の x = q(i) での最小値を元に dp[i] を計算する.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
問題たち
https://atcoder.jp/contests/dp/tasks/dp_z
https://atcoder.jp/contests/jag2015summer-day4/
tasks/icpc2015summer_day4_i
https://atcoder.jp/contests/
colopl2018-final-open/tasks/colopl2018_final_c
https://yukicoder.me/problems/no/409
http://codeforces.com/contest/631/problem/E
Convex Hull Trick rsk0315
導入 実装 応用 おわり
バグとのたたかい
私は Li Chao tree を実装するのに 9 回 WA を出しました.
Convex Hull Trick rsk0315
導入 実装 応用 おわり
自分とのたたかい
久々に fastest を得る遊びをしました (8 ms).
Convex Hull Trick rsk0315
終
制作・著作
導入 実装 応用 おわり
Thank you!
Convex Hull Trick rsk0315

More Related Content

What's hot

AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Inc.
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解くshindannin
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Inc.
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端Yoichi Iwata
 
AtCoder Beginner Contest 004 解説
AtCoder Beginner Contest 004 解説AtCoder Beginner Contest 004 解説
AtCoder Beginner Contest 004 解説AtCoder Inc.
 
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方Tsuneo Yoshioka
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Inc.
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木理玖 川崎
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~Yuma Inoue
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Inc.
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Inc.
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Inc.
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Inc.
 

What's hot (20)

AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
AtCoder Beginner Contest 004 解説
AtCoder Beginner Contest 004 解説AtCoder Beginner Contest 004 解説
AtCoder Beginner Contest 004 解説
 
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説
 
WUPC2012
WUPC2012WUPC2012
WUPC2012
 
abc032
abc032abc032
abc032
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
全域木いろいろ
全域木いろいろ全域木いろいろ
全域木いろいろ
 

Similar to Convex Hull Trick

topology of musical data
topology of musical datatopology of musical data
topology of musical dataTatsuki SHIMIZU
 
introductino to persistent homology and topological data analysis
introductino to persistent homology and topological data analysisintroductino to persistent homology and topological data analysis
introductino to persistent homology and topological data analysisTatsuki SHIMIZU
 
20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算matsumoring
 
PRML 1.6 情報理論
PRML 1.6 情報理論PRML 1.6 情報理論
PRML 1.6 情報理論sleepy_yoshi
 
PFDS 8.4.3 Real-Time Deques
PFDS 8.4.3 Real-Time DequesPFDS 8.4.3 Real-Time Deques
PFDS 8.4.3 Real-Time Deques昌平 村山
 
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスターUnity Technologies Japan K.K.
 
Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Masahiro Sakai
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programmingKeisuke OTAKI
 
ディジタル信号処理 課題解説(その3) 2014年度版
ディジタル信号処理 課題解説(その3) 2014年度版ディジタル信号処理 課題解説(その3) 2014年度版
ディジタル信号処理 課題解説(その3) 2014年度版dsp_kyoto_2014
 
Icml yomikai 07_16
Icml yomikai 07_16Icml yomikai 07_16
Icml yomikai 07_16Yo Ehara
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転Yoshihiro Mizoguchi
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Inc.
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3noname409
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011Preferred Networks
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたKazuyuki TAKASE
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数Taketo Sano
 

Similar to Convex Hull Trick (20)

topology of musical data
topology of musical datatopology of musical data
topology of musical data
 
introductino to persistent homology and topological data analysis
introductino to persistent homology and topological data analysisintroductino to persistent homology and topological data analysis
introductino to persistent homology and topological data analysis
 
20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算
 
PRML 1.6 情報理論
PRML 1.6 情報理論PRML 1.6 情報理論
PRML 1.6 情報理論
 
PFDS 8.4.3 Real-Time Deques
PFDS 8.4.3 Real-Time DequesPFDS 8.4.3 Real-Time Deques
PFDS 8.4.3 Real-Time Deques
 
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
 
Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programming
 
PRML 10.4 - 10.6
PRML 10.4 - 10.6PRML 10.4 - 10.6
PRML 10.4 - 10.6
 
ディジタル信号処理 課題解説(その3) 2014年度版
ディジタル信号処理 課題解説(その3) 2014年度版ディジタル信号処理 課題解説(その3) 2014年度版
ディジタル信号処理 課題解説(その3) 2014年度版
 
Icml yomikai 07_16
Icml yomikai 07_16Icml yomikai 07_16
Icml yomikai 07_16
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
 
Chainerで流体計算
Chainerで流体計算Chainerで流体計算
Chainerで流体計算
 

More from HCPC: 北海道大学競技プログラミングサークル

More from HCPC: 北海道大学競技プログラミングサークル (20)

写像 12 相
写像 12 相写像 12 相
写像 12 相
 
ACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しいACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しい
 
ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断
 
ACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFSACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFS
 
ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解
 
ACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取りACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取り
 
ACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェ
 
ACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探しACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探し
 
HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木
 
HUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャムHUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャム
 
HUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMGHUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMG
 
HUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD RushHUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD Rush
 
HUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺しHUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺し
 
HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号
 
HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元
 
HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?
 
HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価
 
HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍
 
HUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four teaHUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four tea
 
プログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニックプログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニック
 

Recently uploaded

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Recently uploaded (9)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

Convex Hull Trick

  • 1. 導入 実装 応用 おわり Convex Hull Trick えび (rsk0315) HCPC 春の勉強会 @ April 4, 2019 Convex Hull Trick rsk0315
  • 2. 導入 実装 応用 おわり 最近知ったこと (1/3) 最初に,えびちゃんが最近お勉強したことの紹介をします. 興味を持ったものがあったら実装してみてね. フラクショナルカスケーディング 長さ k の sorted 配列 n 個に対して x を探す問題を考える. 愚直にやると O(n log k) のところを O(n + log k) にできる. 双対 LP ある種の最適化問題を別の最適化問題に言いかえる. 最短路とか最小費用流とかに帰着されたりする. Convex Hull Trick rsk0315
  • 3. 導入 実装 応用 おわり 最近知ったこと (2/3) 非再帰セグ木 区間の不等号がどうこう,みたいなバグとばいばいできる. 配列長を 2 べきにしなくてもよい. a[i] の取得を O(1) でできる. 遅延伝播もできる. かっこいい. HL 分解 木のパス上のクエリを高速に処理できる.   ブ ル ー フ カ Bor˚uvka 法 最小全域木を求めるアルゴリズム. 各連結成分で最小コストの辺を選ぶのを繰り返す. Convex Hull Trick rsk0315
  • 4. 導入 実装 応用 おわり 最近知ったこと (3/3) Lagrange 補間 n 次多項式 f について f(x0), f(x1), . . . , f(xn) が既知とする. このとき,任意の x に対して f(x) を計算できる. xi = i としておくと高速化が楽. Tonelli–Shanks アルゴリズム a, p に対して x2 ≡ a (mod p) なる x を求める. p = (2q − 1) · 2S に対して O(S log S/ log log S). Convex hull trick 直線群に関する特定のクエリを処理する. 今日はこれを紹介します. Convex Hull Trick rsk0315
  • 5. 導入 実装 応用 おわり 今日の流れ Convex hull trick(以下 CHT)を以下の流れでお勉強します. なにができるの? どう実装するの? どんな問題に応用できるの? Convex Hull Trick rsk0315
  • 6. 導入 実装 応用 おわり できる操作 xy-平面上の直線の集合 L に対して,次の操作を高速に行う. 集合に新たな直線を追加する. L の直線のうち,与えられた座標 x での y の最小値を答える. x y O Convex Hull Trick rsk0315
  • 7. 導入 実装 応用 おわり 実装のやり方 大きく分けて以下の二つがありそう. 連想配列で処理するもの ✓ オンライン処理できる × 実装を雑にやると log が二つつく セグメント木で処理するもの Li Chao (segment) tree とか呼ばれる ✓ 線分の追加もできるかも? × オフライン処理しなきゃかも(クエリの先読み) 最小値クエリの x 座標(の候補)の数を N として 全体で O(N) 空間,クエリあたり O(log N) 時間かかる. × 0 ⩽ x ⩽ 109 とかだとつらい. ✓ 0 ⩽ x ⩽ 105 とかならオンライン処理もできそう. Convex Hull Trick rsk0315
  • 8. 導入 実装 応用 おわり 重要な性質 x y O 最小値をとる部分について傾きが単調減少となる. どの点においても最小値をとらない直線は無視してよい. → 無視できるかどうかの判定はどうしよう? Convex Hull Trick rsk0315
  • 9. 導入 実装 応用 おわり 追加クエリ I こういうのは帰納的に考えると楽で,base case は次の通り. 一本目の直線 → 常に必要. 二本目の直線 傾きが同じなら切片が大きい方は必要ない. そうでなければ両方必要. Convex Hull Trick rsk0315
  • 10. 導入 実装 応用 おわり 追加クエリ II 次のような状況下で直線を追加することを考えるとよい. 不要な直線はすべて捨てられている. 必要な直線が二本以上存在する. 自明なケースの判定: 傾きが最小・最大の直線は常に必要. x の絶対値が十分大きい点を考えよ. 傾きが同一の直線は切片が最小のもののみ必要. Convex Hull Trick rsk0315
  • 11. 導入 実装 応用 おわり 追加クエリ III 追加する直線 ℓ′ に対して,直線二本 ℓ1, ℓ2 を以下のように選ぶ: 傾き順で並ぶ直線群に ℓ′ を入れるときに ℓ′ をはさむ二直線. !! 最小値をとる部分の傾きは単調減少 ℓ?, . . . , ℓ1, ℓ′, ℓ2, . . . , ℓ?. e.g. 傾き {5, 4, 2, 1} の直線群に対して傾き 3 の直線 ℓ′ を追加する → ℓ1 は傾き 4,ℓ2 は傾き 2 の直線. Convex Hull Trick rsk0315
  • 12. 導入 実装 応用 おわり 追加クエリ IV ℓ′ と ℓ1, ℓ2 の位置関係を調べる. x y O ℓ1 と ℓ2 の交点より上を ℓ′ が通る場合,ℓ′ は不要. 交点を通る場合も不要としてよい. Convex Hull Trick rsk0315
  • 13. 導入 実装 応用 おわり 追加クエリ IV ℓ′ と ℓ1, ℓ2 の位置関係を調べる. x y O ℓ1 と ℓ2 の交点より下を ℓ′ が通る場合,ℓ′ は必要. 交点との ℓ′ との位置関係を調べる方法を考えればよい. Convex Hull Trick rsk0315
  • 14. 導入 実装 応用 おわり 追加クエリ V ℓ1 : y = a1x + b1 ℓ2 : y = a2x + b2 ℓ′ : y = a′ x + b′ とすると,ℓ1, ℓ2 の交点 (xc, yc) は計算できる. で,a′xc + b′ と yc の大小関係を考えるとよい. 結局,次の条件が成り立つとき ℓ′ は不要だとわかるはず. 不等号とか逆だったら許して. (a′ − a2) · (b′ − b1) ⩾ (a1 − a′ ) · (b2 − b′ ). 簡単な式で判定できることだけわかってもらえたらいいです. Convex Hull Trick rsk0315
  • 15. 導入 実装 応用 おわり 追加クエリ VI 結局,追加クエリは次のように処理すればよい. 1. ℓ′ に対して前述の判定を行う. → 不要なら終了.必要なら ℓ′ を L に追加. 2. ℓ2 が不要になっていないか同様に判定し,不要なら消す. 2+. 必要な直線が見つかるまで ℓ2 を選び直し,消し続ける. 3. ℓ1 についても同様. これをがんばって実装するとよいです.できますね. ここからは最小値クエリを考えます. Convex Hull Trick rsk0315
  • 16. 導入 実装 応用 おわり 重要な性質 ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる. x y 傾き y Convex Hull Trick rsk0315
  • 17. 導入 実装 応用 おわり 重要な性質 ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる. x y 傾き y Convex Hull Trick rsk0315
  • 18. 導入 実装 応用 おわり 重要な性質 ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる. x y 傾き y Convex Hull Trick rsk0315
  • 19. 導入 実装 応用 おわり 重要な性質 ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる. x y 傾き y Convex Hull Trick rsk0315
  • 20. 導入 実装 応用 おわり 重要な性質 ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる. x y 傾き y Convex Hull Trick rsk0315
  • 21. 導入 実装 応用 おわり 重要な性質 ある x 座標に注目して,各直線の傾きと y 座標の関係を見てみる. x y 傾き y 凸になっている!(この最小値がクエリの答え) Convex Hull Trick rsk0315
  • 22. 導入 実装 応用 おわり 最小値クエリ 離散な凸関数の最小値は二分探索で求められる. 連想配列で直線を管理すると,ある点での値を計算しやすそう. map[ 傾き ] → 切片 傾きの降順でソートして持っておくと追加が楽. → 平衡二分探索木ベースの連想配列(std::map)がよさそう. 各ステップで毎回連想配列から探すと O((log |L|)2) 時間. → 工夫してなんとかするとよさそう. Convex Hull Trick rsk0315
  • 23. 導入 実装 応用 おわり 限定された状況下での最適化 追加する直線の傾きが単調減少な場合 → 挿入位置が常に末尾なので,std::vector とかでよい. さらに最小値クエリが単調増加の場合 → 古い直線から不要になっていく.std::deque が適役. ならし O(1) 時間で各クエリを処理できる.わーい. Convex Hull Trick rsk0315
  • 24. 導入 実装 応用 おわり 補足(追記) ある直線と,それが最小値をとる区間との対応付けを覚えておい て処理する方法のが自然かも? なんだけど,整数だと区間の端点を切り下げたり切り上げる必要 があって,これは C++の除算の仕様と気持ちが合わなくて無限に バグらせがち.やめたい.やめてしまった. Convex Hull Trick rsk0315
  • 25. 導入 実装 応用 おわり ひとやすみ ここまでが連想配列ベースの実装. ここからはセグメント木ベースの実装. Convex Hull Trick rsk0315
  • 26. 導入 実装 応用 おわり 実装方針 最小値クエリで聞かれる点 {x0, x1, . . . , xN−1} が既知とする. 各ノードはいくつかの点をカバーしていて,一つの直線を持つ. 直線群のうち xi での値が最小となる直線は,xi をカバーする ノードのいずれかが持っているように保つ. y = 0x + ∞ みたいな直線で初期化しておく. {x0, x1, x2, x3, x4, x5, x6, x7} {x0, x1, x2, x3} {x4, x5, x6, x7} {x0, x1} {x2, x3} {x4, x5} {x6, x7} {x0} {x1} {x2} {x3} {x4} {x5} {x6} {x7} Convex Hull Trick rsk0315
  • 27. 導入 実装 応用 おわり 追加クエリ 根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ と追加する直線 ℓ′ について,3 つの x 座標での値を比較する. {x0, x1, . . . , x7} を例に考える. x0 x4中間を選ぶ→ x7 両端点で下回っているなら ℓ を ℓ′ で置き換えて終了. Convex Hull Trick rsk0315
  • 28. 導入 実装 応用 おわり 追加クエリ 根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ と追加する直線 ℓ′ について,3 つの x 座標での値を比較する. {x0, x1, . . . , x7} を例に考える. x0 x4中間を選ぶ→ x7 両端点で上回っているなら何もせず終了. Convex Hull Trick rsk0315
  • 29. 導入 実装 応用 おわり 追加クエリ 根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ と追加する直線 ℓ′ について,3 つの x 座標での値を比較する. {x0, x1, . . . , x7} を例に考える. x0 x4中間を選ぶ→ x7 1 点で下回っているなら,下回っている方の子ノードを更新. Convex Hull Trick rsk0315
  • 30. 導入 実装 応用 おわり 追加クエリ 根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ と追加する直線 ℓ′ について,3 つの x 座標での値を比較する. {x0, x1, . . . , x7} を例に考える. x0 x4中間を選ぶ→ x7 1 点で下回っているなら,下回っている方の子ノードを更新. Convex Hull Trick rsk0315
  • 31. 導入 実装 応用 おわり 追加クエリ 根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ と追加する直線 ℓ′ について,3 つの x 座標での値を比較する. {x0, x1, . . . , x7} を例に考える. x0 x4中間を選ぶ→ x7 それ以外のとき,ℓ と ℓ′ を交換すると 1 点のパターンに帰着可能. Convex Hull Trick rsk0315
  • 32. 導入 実装 応用 おわり 追加クエリ 根ノードからトップダウンに更新していく.ノードの持つ直線 ℓ と追加する直線 ℓ′ について,3 つの x 座標での値を比較する. {x0, x1, . . . , x7} を例に考える. x0 x4中間を選ぶ→ x7 それ以外のとき,ℓ と ℓ′ を交換すると 1 点のパターンに帰着可能. Convex Hull Trick rsk0315
  • 33. 導入 実装 応用 おわり 最小値クエリ 作り方から明らか. xi をカバーするノードを全部見る. それらのノードの持つ直線の xi での値の最小値が答え. Convex Hull Trick rsk0315
  • 34. 導入 実装 応用 おわり ひとやすみ ここまでは実装の話. ところで CHT はなんの名前なの? 概念? 実装? ??? : {CHT, Li Chao tree, . . . } CHT : {Li Chao tree, . . . } ハッシュは連想配列を指す用語ではない!(素振り) で,ここからは応用の話. Convex Hull Trick rsk0315
  • 35. 導入 実装 応用 おわり 応用 – 例題 EDPC Z – Frog 3 N 個の足場があって,それぞれ高さは h1, h2, . . . , hN です. 足場 j から i へ跳ぶと,コスト (hi − hj)2 + C かかります. 足場 1 から N まで行くときの最小コストを求めてね. 1 ⩽ N ⩽ 2 × 105,1 ⩽ h1 < · · · < hN ⩽ 106,1 ⩽ C ⩽ 1012. dp[i] = min 1⩽j<i {dp[j] + (hi − hj)2 + C}??? O(N2) かかって破滅では... ? Convex Hull Trick rsk0315
  • 36. 導入 実装 応用 おわり 解説 展開してみる. dp[i] = min 1⩽j<i {dp[j] + h2 i − 2hihj + h2 j + C} Convex Hull Trick rsk0315
  • 37. 導入 実装 応用 おわり 解説 展開してみる. dp[i] = min 1⩽j<i {dp[j] + h2 i − 2hihj + h2 j + C} j から見た定数たちは外に出せる. dp[i] = min 1⩽j<i {dp[j] − 2hihj + h2 j } + h2 i + C Convex Hull Trick rsk0315
  • 38. 導入 実装 応用 おわり 解説 展開してみる. dp[i] = min 1⩽j<i {dp[j] + h2 i − 2hihj + h2 j + C} j から見た定数たちは外に出せる. dp[i] = min 1⩽j<i {dp[j] − 2hihj + h2 j } + h2 i + C i に関してまとめてみる. dp[i] = min 1⩽j<i {(−2hj)hi + (dp[j] + h2 j )} + h2 i + C ん? Convex Hull Trick rsk0315
  • 39. 導入 実装 応用 おわり 遷移を眺める dp[2] = min {(−2h1)h2 + (dp[1] + h2 1)} + h2 2 + C; Convex Hull Trick rsk0315
  • 40. 導入 実装 応用 おわり 遷移を眺める dp[2] = min {(−2h1)h2 + (dp[1] + h2 1)} + h2 2 + C; dp[3] = min {(−2h1)h3 + (dp[1] + h2 1), = (−2h2)h3 + (dp[2] + h2 2)} + h2 3 + C; Convex Hull Trick rsk0315
  • 41. 導入 実装 応用 おわり 遷移を眺める dp[2] = min {(−2h1)h2 + (dp[1] + h2 1)} + h2 2 + C; dp[3] = min {(−2h1)h3 + (dp[1] + h2 1), = (−2h2)h3 + (dp[2] + h2 2)} + h2 3 + C; dp[4] = min {(−2h1)h4 + (dp[1] + h2 1), = (−2h2)h4 + (dp[2] + h2 2), = (−2h3)h4 + (dp[3] + h2 3)} + h2 4 + C; Convex Hull Trick rsk0315
  • 42. 導入 実装 応用 おわり 遷移を眺める dp[2] = min {(−2h1)h2 + (dp[1] + h2 1)} + h2 2 + C; dp[3] = min {(−2h1)h3 + (dp[1] + h2 1), = (−2h2)h3 + (dp[2] + h2 2)} + h2 3 + C; dp[4] = min {(−2h1)h4 + (dp[1] + h2 1), = (−2h2)h4 + (dp[2] + h2 2), = (−2h3)h4 + (dp[3] + h2 3)} + h2 4 + C; = ↑傾き ↑切片 Convex Hull Trick rsk0315
  • 43. 導入 実装 応用 おわり 遷移を眺める dp[2] = min {(−2h1)h2 + (dp[1] + h2 1)} + h2 2 + C; dp[3] = min {(−2h1)h3 + (dp[1] + h2 1), = (−2h2)h3 + (dp[2] + h2 2)} + h2 3 + C; dp[4] = min {(−2h1)h4 + (dp[1] + h2 1), = (−2h2)h4 + (dp[2] + h2 2), = (−2h3)h4 + (dp[3] + h2 3)} + h2 4 + C; = ↑傾き ↑切片 dp[i] では,x = hi における直線群の最小値を求めている! → CHT で求められる! Convex Hull Trick rsk0315
  • 44. 導入 実装 応用 おわり まとめ 一般に,以下のような遷移をする DP に対して強気になれる. dp[i] := min 1⩽j<i {p(j)q(i) + r(j)} + s(i) i = 2, . . . , N に対して次の処理をすればよい. 1. 直線 y = p(i − 1) · x + r(i − 1) を追加する. 2. 直線群の x = q(i) での最小値を元に dp[i] を計算する. Convex Hull Trick rsk0315
  • 45. 導入 実装 応用 おわり 問題たち https://atcoder.jp/contests/dp/tasks/dp_z https://atcoder.jp/contests/jag2015summer-day4/ tasks/icpc2015summer_day4_i https://atcoder.jp/contests/ colopl2018-final-open/tasks/colopl2018_final_c https://yukicoder.me/problems/no/409 http://codeforces.com/contest/631/problem/E Convex Hull Trick rsk0315
  • 46. 導入 実装 応用 おわり バグとのたたかい 私は Li Chao tree を実装するのに 9 回 WA を出しました. Convex Hull Trick rsk0315
  • 47. 導入 実装 応用 おわり 自分とのたたかい 久々に fastest を得る遊びをしました (8 ms). Convex Hull Trick rsk0315
  • 48. 終 制作・著作 導入 実装 応用 おわり Thank you! Convex Hull Trick rsk0315