SlideShare a Scribd company logo
導入 実装 応用 おわり
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

Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
Nagisa Eto
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
AtCoder Inc.
 
直前合宿 講義スライド
直前合宿 講義スライド直前合宿 講義スライド
直前合宿 講義スライド
tozan gezan
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
AtCoder Inc.
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
AtCoder Inc.
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
理玖 川崎
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
AtCoder Inc.
 
abc032
abc032abc032
abc032
AtCoder Inc.
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端Yoichi Iwata
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説
AtCoder Inc.
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
Masaki Hara
 
Abc009
Abc009Abc009
Abc009
AtCoder Inc.
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
AtCoder Inc.
 

What's hot (20)

Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
直前合宿 講義スライド
直前合宿 講義スライド直前合宿 講義スライド
直前合宿 講義スライド
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
abc032
abc032abc032
abc032
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説
 
Chokudai search
Chokudai searchChokudai search
Chokudai search
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
Abc009
Abc009Abc009
Abc009
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 

Similar to Convex Hull Trick

topology of musical data
topology of musical datatopology of musical data
topology of musical data
Tatsuki 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 analysis
Tatsuki 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 programming
Keisuke OTAKI
 
PRML 10.4 - 10.6
PRML 10.4 - 10.6PRML 10.4 - 10.6
PRML 10.4 - 10.6
Akira Miyazawa
 
ディジタル信号処理 課題解説(その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
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3noname409
 
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011Preferred Networks
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数Taketo Sano
 
Chainerで流体計算
Chainerで流体計算Chainerで流体計算
Chainerで流体計算
Preferred Networks
 
PRML 第4章
PRML 第4章PRML 第4章
PRML 第4章
Akira Miyazawa
 

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
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3
 
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
 
Chainerで流体計算
Chainerで流体計算Chainerで流体計算
Chainerで流体計算
 
PRML 第4章
PRML 第4章PRML 第4章
PRML 第4章
 

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

写像 12 相
写像 12 相写像 12 相
ACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しいACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しい
HCPC: 北海道大学競技プログラミングサークル
 
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 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解
HCPC: 北海道大学競技プログラミングサークル
 
ACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取りACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取り
HCPC: 北海道大学競技プログラミングサークル
 
ACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェACPC 2019 Day3 B: パフェ
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 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 F: MOD Rush
HUPC 2019 Day2 F: MOD RushHUPC 2019 Day2 F: MOD Rush
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: グリッドの番号
HCPC: 北海道大学競技プログラミングサークル
 
HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元
HCPC: 北海道大学競技プログラミングサークル
 
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 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
プログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニックプログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニック
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

【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
atsushi061452
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 

Recently uploaded (15)

【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 

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