SlideShare a Scribd company logo
University CodeSprint 4
Magic Value
@satanic0258
問題概要
• 配列𝐵 = [𝐵1, 𝐵2, … , 𝐵 𝑚]に対して,
◦𝑣 𝑖, 𝑗 ∶= 𝑖 ⋅ gcd 𝐵𝑖, 𝐵𝑖+1, … , 𝐵𝑗 , 1 ≤ 𝑖 ≤ 𝑗 ≤ 𝑚
◦𝑣 𝑚𝑎𝑥 ∶= max
1≤𝑖≤𝑗≤𝑚
{𝑣 𝑖, 𝑗 }
◦𝑣 𝑚𝑖𝑛 ∶= min
1≤𝑖≤𝑗≤𝑚
{𝑣 𝑖, 𝑗 }
としたとき, 𝑣 𝑚𝑎𝑥 − 𝑣 𝑚𝑖𝑛 ⋅ 𝑚を𝐵のmagic valueと定義する.
• 長さ𝑛の配列𝐴 = [𝐴1, 𝐴2, … , 𝐴 𝑛]が与えられたとき,
𝐴のすべての連続部分列のmagic valueの和を求めなさい.
Magic Value 2
制約
• 満点
◦1 ≤ 𝑛 ≤ 2 × 105
◦0 ≤ 𝐴𝑖 ≤ 109
• 部分点(40%)
◦1 ≤ 𝑛 ≤ 4000
Magic Value 3
観察 – 最大公約数について(1/2)
• ある整数𝑎 (𝑎 ≥ 1)に対して,
どんな整数𝑏 (𝑏 ≥ 0)に対しても𝑎 ≥ gcd(𝑎, 𝑏)となります.
• 3個以上の整数𝑎1, 𝑎2, 𝑎3, … の最大公約数𝑔は,
𝑔 = 𝑎1
𝑔 = gcd(𝑔, 𝑎2)
𝑔 = gcd(𝑔, 𝑎3)
⋮
として得られます.
Magic Value 4
観察 – 最大公約数について(2/2)
• このことから,gcdを取る区間の長さを大きくすると
gcdの値は変わらないか小さくなることがわかります.
• 従って,ある長さ𝑚の配列𝐵に対して,
◦𝑣 𝑚𝑎𝑥は長さ1の区間,すなわち,𝑣 𝑚𝑎𝑥 = max
1≤𝑖≤𝑚
{𝑣 𝑖, 𝑖 } = max
1≤𝑖≤𝑚
{𝑖 ⋅ 𝐵𝑖}
◦𝑣 𝑚𝑖𝑛は長さ𝑚の区間,すなわち,𝑣 𝑚𝑖𝑛 = 𝑣 1, 𝑚 = gcd 𝐵1, … , 𝐵 𝑚
となります.
◦ただし,𝐵に0が含まれるとき𝑣 𝑚𝑖𝑛 = gcd 0 = 0が最も小さいです.
Magic Value 5
部分点解法-𝑂 𝑛2
log max 𝐴
• 以上より,次のようにして部分点を得ることが出来ます.
(MODを取る部分は省略)
Magic Value 6
for l in [1, n]:
int g := A[l]; // 最大公約数
int max := A[l]; // 最大値
bool has0 := false; // 見ている区間に0が含まれているか
for r in [l, n]: // 区間[l,r]について
if(A[r] == 0) has0 := true;
if(max < A[r]) max := A[r];
g := gcd(g, A[r]); // ここの計算量はO(log(max(A)))
if(has0) g := 0; // 区間に0があればgcdを0にする
ans += (max - g) * (r - l + 1);
満点解法への準備(1/2)
• 以上のコードは𝑂(𝑛2
log max 𝐴 )時間かかるため,
満点は得られません(gcd操作は𝑂(log max 𝐴 時間).
• そこで満点解法への準備として,次を定義します.
◦𝑣 𝑚𝑎𝑥 𝑖, 𝑗 ∶= 配列[𝐴𝑖, … , 𝐴𝑗]に対する𝑣 𝑚𝑎𝑥
◦𝑣 𝑚𝑖𝑛 𝑖, 𝑗 ∶= 配列[𝐴𝑖, … , 𝐴𝑗]に対する𝑣 𝑚𝑖𝑛
• このとき,答え𝑎𝑛𝑠は
𝑎𝑛𝑠 = σ1≤𝑖≤𝑗≤𝑛 𝑣 𝑚𝑎𝑥(𝑖, 𝑗) − 𝑣 𝑚𝑖𝑛(𝑖, 𝑗) ⋅ 𝑗 − 𝑖 + 1
となります.
(( 𝑗 − 𝑖 + 1 )は区間[𝑖, 𝑗]の長さ)
Magic Value 7
満点解法への準備(2/2)
• ここで,
𝑎𝑛𝑠 𝑚𝑎𝑥 ∶= σ1≤𝑖≤𝑗≤𝑛 𝑣 𝑚𝑎𝑥(𝑖, 𝑗) ⋅ 𝑗 − 𝑖 + 1
𝑎𝑛𝑠 𝑚𝑖𝑛 ∶= σ1≤𝑖≤𝑗≤𝑛 𝑣 𝑚𝑖𝑛(𝑖, 𝑗) ⋅ 𝑗 − 𝑖 + 1
とすると,
𝑎𝑛𝑠 = 𝑎𝑛𝑠 𝑚𝑎𝑥 − 𝑎𝑛𝑠 𝑚𝑖𝑛
として答えを求めることが出来ます.
• 以下,𝑎𝑛𝑠 𝑚𝑎𝑥, 𝑎𝑛𝑠 𝑚𝑖𝑛をそれぞれ求める方法を述べていきます.
◦𝑎𝑛𝑠 𝑚𝑎𝑥 → 9ページ, 𝑎𝑛𝑠 𝑚𝑖𝑛 → 48ページ
Magic Value 8
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(01/37)-整理
• 定義から,
𝑎𝑛𝑠 𝑚𝑎𝑥 = σ1≤𝑖≤𝑗≤𝑛 𝑣 𝑚𝑎𝑥(𝑖, 𝑗) ⋅ 𝑗 − 𝑖 + 1
でした.
• ここで,定義より𝑣 𝑚𝑎𝑥 𝑖, 𝑗 = max
𝑖≤𝑘≤𝑗
{ 𝑘 − 𝑖 + 1 ⋅ 𝐴 𝑘}ですが,
◦𝑘 < 𝑖のとき, 𝑘 − 𝑖 + 1 ⋅ 𝐴 𝑘 ≤ 0
◦𝑘 ≥ 𝑖のとき, 𝑘 − 𝑖 + 1 ⋅ 𝐴 𝑘 ≥ 0
より, 𝑣 𝑚𝑎𝑥 𝑖, 𝑗 = max
1≤𝑘≤𝑗
{ 𝑘 − 𝑖 + 1 ⋅ 𝐴 𝑘}としても良いことが
わかります.
Magic Value 9
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(02/37)-整理
• よって,右端𝑗を固定して左端𝑖を動かし和を取ると,
𝑎𝑛𝑠 𝑚𝑎𝑥 = ෍
𝑗=1
𝑛
෍
𝑖=1
𝑗
max
1≤𝑘≤𝑗
𝑘 − 𝑖 + 1 ⋅ 𝐴 𝑘 ⋅ 𝑗 − 𝑖 + 1
となります.
Magic Value 10
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(03/37)-整理
• ところで,maxの中身 𝑘 − 𝑖 + 1 ⋅ 𝐴 𝑘を式変形すると,
−𝐴 𝑘 𝑖 + 𝑘 + 1 𝐴 𝑘となります.
• これを見ると,𝑖を独立変数とする直線(一次関数)の形と
なっていることがわかります.
Magic Value 11
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(03/37)-整理
• ところで,maxの中身 𝑘 − 𝑖 + 1 ⋅ 𝐴 𝑘を式変形すると,
−𝐴 𝑘 𝑖 + 𝑘 + 1 𝐴 𝑘となります.
• これを見ると,𝑖を独立変数とする直線(一次関数)の形と
なっていることがわかります.
• 従って,このmaxを言い換えると
「𝑗本の直線𝐿 𝑘 𝑥 = −𝐴 𝑘 𝑥 + 𝑘 + 1 𝐴 𝑘 (1 ≤ 𝑘 ≤ 𝑗)の中で
𝑥 = 𝑖のときに直線が取る値の最大値」
となります.
Magic Value 12
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(04/37)-整理
• 今,求めたい𝑎𝑛𝑠 𝑚𝑎𝑥は
𝑎𝑛𝑠 𝑚𝑎𝑥 = ෍
𝑗=1
𝑛
෍
𝑖=1
𝑗
max
1≤𝑘≤𝑗
𝑘 − 𝑖 + 1 ⋅ 𝐴 𝑘 ⋅ 𝑗 − 𝑖 + 1
であったので,𝑗を増やす度に直線𝐿𝑗 𝑥 = −𝐴𝑗 𝑥 + 𝑗 + 1 𝐴𝑗を
追加し,1 ≤ 𝑖 ≤ 𝑗なる𝑖について和を求めればよいです.
Magic Value 13
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(04/37)-整理
• 今,求めたい𝑎𝑛𝑠 𝑚𝑎𝑥は
𝑎𝑛𝑠 𝑚𝑎𝑥 = ෍
𝑗=1
𝑛
෍
𝑖=1
𝑗
max
1≤𝑘≤𝑗
𝑘 − 𝑖 + 1 ⋅ 𝐴 𝑘 ⋅ 𝑗 − 𝑖 + 1
であったので,𝑗を増やす度に直線𝐿𝑗 𝑥 = −𝐴𝑗 𝑥 + 𝑗 + 1 𝐴𝑗を
追加し,1 ≤ 𝑖 ≤ 𝑗なる𝑖について和を求めればよいです.
• これは例えばConvex-Hull Trickで解くことが出来ますが,
各𝑗について全ての𝑖を調べていると結局𝑂(𝑛2
)時間かかります.
(最大値取得に𝑓(𝑛)時間かかれば𝑂(𝑛2 𝑓 𝑛 )時間)
Magic Value 14
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(05/37)-整理
• ここで,直線を𝑗本追加したあとについて,
𝑔𝑒𝑡 𝑖 ≔ max
1≤𝑘≤𝑗
𝑘 − 𝑖 + 1 ⋅ 𝐴 𝑘 とし,
𝑎𝑛𝑠 𝑚𝑎𝑥 = ෍
𝑗=1
𝑛
෍
𝑖=1
𝑗
𝑔𝑒𝑡 𝑖 ⋅ 𝑗 − 𝑖 + 1
= ෍
𝑗=1
𝑛
෍
𝑖=1
𝑗
𝑔𝑒𝑡 𝑖 ⋅ 𝑗 + 1 − 𝑔𝑒𝑡 𝑖 ⋅ 𝑖
= ෍
𝑗=1
𝑛
෍
𝑖=1
𝑗
𝑔𝑒𝑡 𝑖 ⋅ 𝑗 + 1 − ෍
𝑖=1
𝑗
𝑔𝑒𝑡 𝑖 ⋅ 𝑖
と変形し,
Magic Value 15
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(06/37)-整理
• 次のクエリを処理するデータ構造𝐷を考えます:
◦𝑎𝑑𝑑𝐿𝑖𝑛𝑒 𝑎, 𝑏 : 直線𝐿 𝑥 = 𝑎𝑥 + 𝑏を追加する
◦𝑆0 𝑖, 𝑗 : σ 𝑘=𝑖
𝑗
𝑔𝑒𝑡 𝑘 の値を取得する
◦𝑆1 𝑖, 𝑗 : σ 𝑘=𝑖
𝑗
(𝑔𝑒𝑡 𝑘 ⋅ 𝑘)の値を取得する
• このとき,𝑎𝑛𝑠 𝑚𝑎𝑥は次のように求められます:
• このときの計算量は,各クエリの計算量がそれぞれ
𝑂 𝑓 𝑛 , 𝑂 𝑔 𝑛 , 𝑂 ℎ 𝑛 であれば𝑂 𝑛 𝑓 𝑛 + 𝑔 𝑛 + ℎ 𝑛 です.
Magic Value 16
for j in [1, n]:
D.addLine(-A[j], (j+1)*A[j]); // 直線L_j(x)を追加する
ans_max += D.S0(1,j)*(j+1) – D.S1(1,j);
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(07/37)-𝐷の実現方法
• この𝐷は,遅延評価Segment Treeを用いて
各クエリを𝑂(log 𝑛)で実現することができます.
◦遅延評価Segment Treeについては省略
• 以降,この実現方法について述べていきます.
Magic Value 17
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(08/37)-𝐷の実現方法
• 𝑆0(𝑖, 𝑗)クエリ,𝑆1(𝑖, 𝑗)クエリについては,
𝑆0 𝑖, 𝑗 = 𝑆0 𝑖, 𝑘 + 𝑆0 𝑘 + 1, 𝑗
𝑆1 𝑖, 𝑗 = 𝑆1 𝑖, 𝑘 + 𝑆1 𝑘 + 1, 𝑗
が成り立ちます.
• よって,区間[𝑖, 𝑗]にσ 𝑘=𝑖
𝑗
𝑔𝑒𝑡 𝑘 , σ 𝑘=𝑖
𝑗
(𝑔𝑒𝑡 𝑘 ⋅ 𝑘)の値を
乗せることで𝑆0(𝑖, 𝑗)クエリ,𝑆1(𝑖, 𝑗)クエリを𝑂(log 𝑛)で
実現することができます.
Magic Value 18
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(09/37)-𝐷の実現方法
• あとは𝑎𝑑𝑑𝐿𝑖𝑛𝑒 𝑎, 𝑏 クエリを処理する方法について
考えていきます.
Magic Value 19
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(10/37)-𝐷の実現方法
• 𝑗本直線を追加した後,直線集合は例えば次のようになります:
Magic Value 20
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(11/37)-𝐷の実現方法
• ここでmaxをとる部分(以降,凸包と言います)に注目すると,
直線の傾きが非減少,すなわち,下に凸であることがわかります.
Magic Value 21
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(12/37)-𝐷の実現方法
• このことから,新たな直線を追加したとき,
凸包の更新部分は必ず連続になります.
Magic Value 22
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(13/37)-𝐷の実現方法
• 従って,この更新部分の両端位置𝑖, 𝑗が分かれば,
区間[𝑖, 𝑗]に対してのみ凸包を更新すればよいことがわかります.
Magic Value 23
𝑖
𝑗
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(14/37)-𝐷の実現方法
• 遅延セグ木で区間更新を行うとき,
区間に作用素を乗せて,取得クエリ時に評価を行います.
• そのため,区間[𝑖, 𝑗]にその区間内を直線𝐿 𝑥 = 𝑎𝑥 + 𝑏で
更新することを意味する作用素{𝑎, 𝑏}も乗せます.
(実装によりますが更新が無いことを表すフラグも
別途持つとよい)
Magic Value 24
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(15/37)-𝐷の実現方法
• さて,更新位置[𝑖, 𝑗]を特定したいですが,
直線を追加したとき,元の凸包と新たな直線との間に
大きく分けて3つの関係があることがわかります.
Magic Value 25
Type 1 Type 2 Type 3
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(16/37)-𝐷の実現方法
• 更新部分の左側であるType 1は,元の凸包に比べ,
新しい直線の取る値が小さく,傾きは大きいです.
Magic Value 26
Type 1 Type 2 Type 3
値:小
傾き:大
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(17/37)-𝐷の実現方法
• 更新部分であるType 2は,元の凸包に比べ,
新しい直線の取る値が大きいです(傾きは大小あります).
Magic Value 27
Type 1 Type 2 Type 3
値:小
傾き:大
値:大
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(18/37)-𝐷の実現方法
• 更新部分の右側であるType 3は,元の凸包に比べ,
新しい直線の取る値が小さく,傾きも小さいです.
Magic Value 28
Type 1 Type 2 Type 3
値:小
傾き:大
値:大 値:小
傾き:小
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(19/37)-𝐷の実現方法
• また,Type1, Type2, Type3は必ず左からこの順に並びます.
(更新部分が存在しない場合,Type1→Type3と並びます)
Magic Value 29
Type 1 Type 2 Type 3
値:小
傾き:大
値:大 値:小
傾き:小
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(20/37)-𝐷の実現方法
• 以上から,区間[𝑖, 𝑗]に
◦𝑥 = 𝑖において凸包を形作る直線𝐿 𝑥 = 𝑎𝑖 𝑥 + 𝑏𝑖
◦𝑥 = 𝑗において凸包を形作る直線𝐿 𝑥 = 𝑎𝑗 𝑥 + 𝑏𝑗
の情報 𝑎𝑖, 𝑏𝑖 , 𝑎𝑗, 𝑏𝑗 を乗せておき,𝑎𝑑𝑑𝐿𝑖𝑛𝑒クエリを処理する際には
次のルールで遅延セグ木上を遷移すれば𝑂(log 𝑛)で実現できます:
◦𝑥 = 𝑖と𝑥 = 𝑗でのTypeが異なる場合,子ノードへ探索を進める
◦𝑥 = 𝑖と𝑥 = 𝑗でのTypeが同じ場合,そのTypeが1か3なら何もせず,
2ならその区間全体を更新する
Magic Value 30
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(21/37)-セグ木探索例
• では,先ほどの例についてセグ木上を探索していく
流れを示します.
Magic Value 31
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(22/37)-セグ木探索例
• Typeが異なるので子ノードを探索する
Magic Value 32
𝑖 𝑗
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(23/37)-セグ木探索例
• Typeが異なるので子ノードを探索する
Magic Value 33
𝑖 𝑗未 未
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(24/37)-セグ木探索例
• Typeが同じでそのTypeは1なので何もしない
Magic Value 34
𝑖 𝑗 未 未未未
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(25/37)-セグ木探索例
• Typeが異なるので子ノードを探索する
Magic Value 35
𝑖 未 未𝑗
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(26/37)-セグ木探索例
• Typeが同じでそのTypeは1なので何もしない
Magic Value 36
𝑖 未 未未𝑗 未
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(27/37)-セグ木探索例
• Typeが同じでそのTypeは2なので更新する
Magic Value 37
未 未𝑖 𝑗
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(28/37)-セグ木探索例
• Typeが異なるので子ノードを探索する
Magic Value 38
更新 𝑖 𝑗
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(29/37)-セグ木探索例
• Typeが異なるので子ノードを探索する
Magic Value 39
更新 𝑖 未𝑗 未
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(30/37)-セグ木探索例
• Typeが同じでそのTypeは2なので更新する
Magic Value 40
更新 𝑖 未 未未𝑗 未
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(31/37)-セグ木探索例
• Typeが同じでそのTypeは3なので何もしない
Magic Value 41
更新 未 未更新 𝑖 𝑗
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(32/37)-セグ木探索例
• Typeが同じでそのTypeは3なので何もしない
Magic Value 42
更新 更新 𝑖 𝑗
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(33/37)-セグ木探索例
• こうして更新部分を特定することが出来ました.
Magic Value 43
更新 更新
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(34/37)-𝐷のまとめ
• 以上をまとめます.
• 遅延セグ木上の区間[𝑖, 𝑗]に対応するノードには
◦σ 𝑘=𝑖
𝑗
𝑔𝑒𝑡 𝑘 の値
◦σ 𝑘=𝑖
𝑗
(𝑔𝑒𝑡 𝑘 ⋅ 𝑘)の値
◦𝑥 = 𝑖において凸包を形作る直線𝐿 𝑥 = 𝑎𝑖 𝑥 + 𝑏𝑖のパラメータ{𝑎𝑖, 𝑏𝑖}
◦𝑥 = 𝑗において凸包を形作る直線𝐿 𝑥 = 𝑎𝑗 𝑥 + 𝑏𝑗のパラメータ 𝑎𝑗, 𝑏𝑗
◦その区間を直線𝐿 𝑥 = 𝑎𝑥 + 𝑏で更新することを表す作用素{𝑎, 𝑏}
を乗せます.
Magic Value 44
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(35/37)-𝐷のまとめ
• 𝑆0(𝑖, 𝑗)クエリ
◦被覆する各区間について, σ 𝑘 𝑔𝑒𝑡 𝑘 の和を答える
• 𝑆1(𝑖, 𝑗)クエリ
◦被覆する各区間について, σ 𝑘 𝑔𝑒𝑡 𝑘 ⋅ 𝑘 の和を答える
• 𝑎𝑑𝑑𝐿𝑖𝑛𝑒(𝑎, 𝑏)クエリ
◦区間[1, 𝑛]の根ノードからはじめ,以下のルールで更新:
▪𝑥 = 𝑖と𝑥 = 𝑗でのTypeが異なる場合,子ノードへ探索を進める
▪𝑥 = 𝑖と𝑥 = 𝑗でのTypeが同じ場合,そのTypeが1か3なら何もせず,
2ならその区間の作用素を更新する
Magic Value 45
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(36/37)-𝐷のまとめ
• なお,区間[𝑖, 𝑗]に作用素{𝑎, 𝑏}を作用させるときは,
◦σ 𝑘=𝑖
𝑗
𝑔𝑒𝑡 𝑘 = σ 𝑘=𝑖
𝑗
(𝑎𝑘 + 𝑏) = 𝑎 ⋅
𝑗 𝑗+1
2
+ 𝑏𝑗 − 𝑎 ⋅
𝑖−1 𝑖
2
+ 𝑏 𝑖 − 1
◦σ 𝑘=𝑖
𝑗
𝑔𝑒𝑡 𝑘 ⋅ 𝑘 = σ 𝑘=𝑖
𝑗
𝑎𝑘2 + 𝑏𝑘
= 𝑎 ⋅
𝑗 𝑗 + 1 2𝑗 + 1
6
+ 𝑏 ⋅
𝑗 𝑗 + 1
2
− 𝑎 ⋅
𝑖 − 1 𝑖 2𝑖 − 1
6
+ 𝑏 ⋅
𝑖 − 1 𝑖
2
◦ 𝑎𝑖, 𝑏𝑖 = 𝑎, 𝑏
◦ 𝑎𝑗, 𝑏𝑗 = 𝑎, 𝑏
とします.
Magic Value 46
満点解法-𝑎𝑛𝑠 𝑚𝑎𝑥(37/37)-まとめ
• 各クエリの計算量はいずれも𝑂(log 𝑛)です.
• 以上で𝑎𝑛𝑠 𝑚𝑎𝑥を𝑂(𝑛 log 𝑛)で求めることが出来ました.
Magic Value 47
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(01/11)-整理
• 定義から,
𝑎𝑛𝑠 𝑚𝑖𝑛 = σ1≤𝑖≤𝑗≤𝑛 𝑣 𝑚𝑖𝑛(𝑖, 𝑗) ⋅ 𝑗 − 𝑖 + 1
でした.
• ここで,区間[𝑖, 𝑗]に𝐴 𝑘 = 0なる𝑘が含まれていた場合,
𝑣 𝑚𝑖𝑛 𝑖, 𝑗 = 0となります.
• 任意の整数に0を足しても値は変わらないため,
0を含む区間については計算する必要がないことがわかります.
Magic Value 48
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(02/11)-整理
• よって,与えられた𝐴を0で分割し,
0を含まない各小区間で𝑎𝑛𝑠 𝑚𝑖𝑛′を求めて足し合わせれば
𝑎𝑛𝑠 𝑚𝑖𝑛を求めることが出来ます.
• 以降,0を含まない列における𝑎𝑛𝑠 𝑚𝑖𝑛を求める方法について
考えます.
Magic Value 49
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(03/11)-整理
• 観察から, 𝑣 𝑚𝑖𝑛 𝑖, 𝑗 = gcd 𝐴𝑖, 𝐴𝑖+1, … , 𝐴𝑗 であったため,
右端𝑗を固定して左端𝑖を動かし和を取ると,
𝑎𝑛𝑠 𝑚𝑖𝑛 = ෍
𝑗=1
𝑛
෍
𝑖=1
𝑗
gcd 𝐴𝑖, 𝐴𝑖+1, … , 𝐴𝑗 ⋅ 𝑗 − 𝑖 + 1
となります.
Magic Value 50
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(04/11)-整理
for j in [1, n]:
for i in [1, j]:
G[i][j] = gcd(G[i][j-1], A[j]);
ans_min += G[i][j] * (j-i+1);
Magic Value 51
• これを𝐺𝑖,𝑗 ≔ gcd 𝐴𝑖, … , 𝐴𝑗 として,
𝐺𝑖,𝑗 = gcd 𝐺𝑖,𝑗−1, 𝐴𝑗 であることを利用すると,
次のようにして𝑎𝑛𝑠 𝑚𝑖𝑛を求めることができます.
(計算量は𝑂 𝑛2
log max 𝐴 であり,まだ遅い)
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(05/11)-整理
for j in [1, n]:
for i in [1, j]:
G[i][j] = gcd(G[i][j-1], A[j]);
ans_min += G[i][j] * (j-i+1);
Magic Value 52
• なお,𝐺𝑖,𝑗を更新する際には𝐺𝑖,𝑗−1しか使っておらず,
またそのときもう𝐺𝑖,𝑘(𝑘 ≤ 𝑗 − 1)の値は必要ないため,
次のようにGを一次元配列としてしまっても構いません.
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(06/11)-𝐺について
• ここで,ある𝑗での各𝐺𝑖には次の値が格納されています:
Magic Value 53
𝒊 𝑮𝒊
1 gcd(𝐴1, 𝐴2, 𝐴3, … , 𝐴𝑗)
2 gcd(𝐴1, 𝐴2, 𝐴3, … , 𝐴𝑗)
⋮ ⋮
𝑗 gcd 𝐴1, 𝐴2, 𝐴3, … , 𝐴𝑗 = 𝐴𝑗
𝑗 + 1 0
⋮ ⋮
𝑛 0
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(07/11)-𝐺について
• gcdの定義から,𝑖 < 𝑗で𝐺𝑖は𝐺𝑖+1を割り切ります.
Magic Value 54
𝒊 𝑮𝒊
1 gcd(𝐴1, 𝐴2, 𝐴3, … , 𝐴𝑗)
2 gcd(𝐴1, 𝐴2, 𝐴3, … , 𝐴𝑗)
⋮ ⋮
𝑗 gcd 𝐴1, 𝐴2, 𝐴3, … , 𝐴𝑗 = 𝐴𝑗
𝑗 + 1 0
⋮ ⋮
𝑛 0
割り切る
割り切る
割り切る
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(08/11)-𝐺について
• このことから,𝐺には高々𝑂(log 𝐴𝑗)種類の数しか
含まれないことがわかります.
• さらに,𝑖 < 𝑗で𝐺𝑖 ≤ 𝐺𝑖+1より,同じ数は連続で含まれている
ことがわかります.
• 以上から,同じ数が含まれている区間は
1つにまとめてしまえばよいことがわかります.
Magic Value 55
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(09/11)-𝐺をまとめる例
Magic Value 56
A 80 36 40 20 72 90 36 20
j
0 1 2 3 4 5 6 7
i 0 80 4 4 4 4 2 2 2
1 0 36 4 4 4 2 2 2
2 0 0 40 20 4 2 2 2
3 0 0 0 20 4 2 2 2
4 0 0 0 0 72 18 18 2
5 0 0 0 0 0 90 18 2
6 0 0 0 0 0 0 36 4
7 0 0 0 0 0 0 0 20
A 80 36 40 20 72 90 36 20
j
0 1 2 3 4 5 6 7
i 0 80 4
4 4
4 2 2
2
1 0 36
2 0 0 40
20
3 0 0 0
4 0 0 0 0 72 18
18
5 0 0 0 0 0 90
6 0 0 0 0 0 0 36 4
7 0 0 0 0 0 0 0 20
Before After
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(10/11)-𝐺をまとめる
• ここで,𝐴𝑗まで更新した後で,𝑙 ≤ 𝑖 ≤ 𝑟において
𝐺𝑖,𝑗 = 𝑔という一定の値を取っていた場合,
その区間で足される値𝑆は,
𝑆 = ෍
𝑖=𝑙
𝑟
𝑔 ⋅ 𝑗 − 𝑖 + 1
= 𝑔 𝑗 + 1 𝑟 − 𝑔 ⋅
𝑟 𝑟 + 1
2
− 𝑔 𝑗 + 1 𝑙 − 1 − 𝑔 ⋅
𝑙 − 1 𝑙
2
となります.
Magic Value 57
満点解法-𝑎𝑛𝑠 𝑚𝑖𝑛(11/11)-𝐺をまとめる
• よって,𝐺の各要素には 値𝑔, 左端𝑙, 右端𝑟 を持たせることで
正しく𝑎𝑛𝑠 𝑚𝑖𝑛の値を求めることが出来ます.
• 実装では,先に𝐺の各要素にgcdを適用したあとで,
隣り合う要素の値𝑔が一致していれば,それらをマージすれば
よいです.
• 以上で𝑎𝑛𝑠 𝑚𝑖𝑛を𝑂 𝑛 log2 max 𝐴 で求めることが出来ました.
Magic Value 58
満点解法-𝑎𝑛𝑠
• 最後に,𝑎𝑛𝑠 = 𝑎𝑛𝑠 𝑚𝑎𝑥 − 𝑎𝑛𝑠 𝑚𝑖𝑛として終わりです.
• 全体で𝑂 𝑛 log 𝑛 + log2 max 𝐴 で解くことが出来ました!
Magic Value 59
おわり

More Related Content

What's hot

はじめてのパターン認識 第6章 後半
はじめてのパターン認識 第6章 後半はじめてのパターン認識 第6章 後半
はじめてのパターン認識 第6章 後半
Prunus 1350
 
Nonparametric Factor Analysis with Beta Process Priors の式解説
Nonparametric Factor Analysis with Beta Process Priors の式解説Nonparametric Factor Analysis with Beta Process Priors の式解説
Nonparametric Factor Analysis with Beta Process Priors の式解説Tomonari Masada
 
PRML第6章「カーネル法」
PRML第6章「カーネル法」PRML第6章「カーネル法」
PRML第6章「カーネル法」
Keisuke Sugawara
 
社内機械学習勉強会 #5
社内機械学習勉強会 #5社内機械学習勉強会 #5
社内機械学習勉強会 #5
shingo suzuki
 
KDD'17読み会:Anomaly Detection with Robust Deep Autoencoders
KDD'17読み会:Anomaly Detection with Robust Deep AutoencodersKDD'17読み会:Anomaly Detection with Robust Deep Autoencoders
KDD'17読み会:Anomaly Detection with Robust Deep Autoencoders
Satoshi Hara
 
PRML復々習レーン#2 2.3.6 - 2.3.7
PRML復々習レーン#2 2.3.6 - 2.3.7PRML復々習レーン#2 2.3.6 - 2.3.7
PRML復々習レーン#2 2.3.6 - 2.3.7
sleepy_yoshi
 
C02
C02C02
PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5
sleepy_yoshi
 
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
narumikanno0918
 
退化型Keller--Segel系の解の有限時刻爆発について
退化型Keller--Segel系の解の有限時刻爆発について退化型Keller--Segel系の解の有限時刻爆発について
退化型Keller--Segel系の解の有限時刻爆発について
Takahiro Hashira
 
線形識別モデル
線形識別モデル線形識別モデル
線形識別モデル
貴之 八木
 
C07
C07C07
読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法
読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法
読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法
健児 青木
 
JOIss2020 発表資料
JOIss2020 発表資料JOIss2020 発表資料
JOIss2020 発表資料
mdkcpp 1015
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
tmaehara
 
PRML復々習レーン#10 7.1.3-7.1.5
PRML復々習レーン#10 7.1.3-7.1.5PRML復々習レーン#10 7.1.3-7.1.5
PRML復々習レーン#10 7.1.3-7.1.5
sleepy_yoshi
 
第4回数理モデル勉強会(日本植物学会第84回大会関連集会)
第4回数理モデル勉強会(日本植物学会第84回大会関連集会)第4回数理モデル勉強会(日本植物学会第84回大会関連集会)
第4回数理モデル勉強会(日本植物学会第84回大会関連集会)
TakaakiYonekura
 
算数で体感する高度数学
算数で体感する高度数学算数で体感する高度数学
算数で体感する高度数学
Arithmer Inc.
 
パターン認識 第12章 正則化とパス追跡アルゴリズム
パターン認識 第12章 正則化とパス追跡アルゴリズムパターン認識 第12章 正則化とパス追跡アルゴリズム
パターン認識 第12章 正則化とパス追跡アルゴリズムMiyoshi Yuya
 

What's hot (20)

はじめてのパターン認識 第6章 後半
はじめてのパターン認識 第6章 後半はじめてのパターン認識 第6章 後半
はじめてのパターン認識 第6章 後半
 
Nonparametric Factor Analysis with Beta Process Priors の式解説
Nonparametric Factor Analysis with Beta Process Priors の式解説Nonparametric Factor Analysis with Beta Process Priors の式解説
Nonparametric Factor Analysis with Beta Process Priors の式解説
 
PRML第6章「カーネル法」
PRML第6章「カーネル法」PRML第6章「カーネル法」
PRML第6章「カーネル法」
 
社内機械学習勉強会 #5
社内機械学習勉強会 #5社内機械学習勉強会 #5
社内機械学習勉強会 #5
 
KDD'17読み会:Anomaly Detection with Robust Deep Autoencoders
KDD'17読み会:Anomaly Detection with Robust Deep AutoencodersKDD'17読み会:Anomaly Detection with Robust Deep Autoencoders
KDD'17読み会:Anomaly Detection with Robust Deep Autoencoders
 
PRML復々習レーン#2 2.3.6 - 2.3.7
PRML復々習レーン#2 2.3.6 - 2.3.7PRML復々習レーン#2 2.3.6 - 2.3.7
PRML復々習レーン#2 2.3.6 - 2.3.7
 
線形計画法入門
線形計画法入門線形計画法入門
線形計画法入門
 
C02
C02C02
C02
 
PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5PRML復々習レーン#3 3.1.3-3.1.5
PRML復々習レーン#3 3.1.3-3.1.5
 
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
 
退化型Keller--Segel系の解の有限時刻爆発について
退化型Keller--Segel系の解の有限時刻爆発について退化型Keller--Segel系の解の有限時刻爆発について
退化型Keller--Segel系の解の有限時刻爆発について
 
線形識別モデル
線形識別モデル線形識別モデル
線形識別モデル
 
C07
C07C07
C07
 
読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法
読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法
読書会 「トピックモデルによる統計的潜在意味解析」 第2回 3.2節 サンプリング近似法
 
JOIss2020 発表資料
JOIss2020 発表資料JOIss2020 発表資料
JOIss2020 発表資料
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
PRML復々習レーン#10 7.1.3-7.1.5
PRML復々習レーン#10 7.1.3-7.1.5PRML復々習レーン#10 7.1.3-7.1.5
PRML復々習レーン#10 7.1.3-7.1.5
 
第4回数理モデル勉強会(日本植物学会第84回大会関連集会)
第4回数理モデル勉強会(日本植物学会第84回大会関連集会)第4回数理モデル勉強会(日本植物学会第84回大会関連集会)
第4回数理モデル勉強会(日本植物学会第84回大会関連集会)
 
算数で体感する高度数学
算数で体感する高度数学算数で体感する高度数学
算数で体感する高度数学
 
パターン認識 第12章 正則化とパス追跡アルゴリズム
パターン認識 第12章 正則化とパス追跡アルゴリズムパターン認識 第12章 正則化とパス追跡アルゴリズム
パターン認識 第12章 正則化とパス追跡アルゴリズム
 

Similar to University CodeSprint 4 - Magic value

暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
 
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながり
MITSUNARI Shigeo
 
場の量子論
場の量子論場の量子論
場の量子論
M M
 
グレブナー基底輪読会 #1 ―準備体操の巻―
グレブナー基底輪読会 #1 ―準備体操の巻―グレブナー基底輪読会 #1 ―準備体操の巻―
グレブナー基底輪読会 #1 ―準備体操の巻―
Yutaka Nagahata
 
表現論 ゼミ資料
表現論 ゼミ資料表現論 ゼミ資料
表現論 ゼミ資料
HanpenRobot
 
(文献紹介) 画像復元:Plug-and-Play ADMM
(文献紹介) 画像復元:Plug-and-Play ADMM(文献紹介) 画像復元:Plug-and-Play ADMM
(文献紹介) 画像復元:Plug-and-Play ADMM
Morpho, Inc.
 
Prml 最尤推定からベイズ曲線フィッティング
Prml 最尤推定からベイズ曲線フィッティングPrml 最尤推定からベイズ曲線フィッティング
Prml 最尤推定からベイズ曲線フィッティング
takutori
 
代数方程式とガロア理論
代数方程式とガロア理論代数方程式とガロア理論
代数方程式とガロア理論
Junpei Tsuji
 
コンピュータビジョン最先端ガイド6 第2章:4~4.2節
コンピュータビジョン最先端ガイド6 第2章:4~4.2節コンピュータビジョン最先端ガイド6 第2章:4~4.2節
コンピュータビジョン最先端ガイド6 第2章:4~4.2節
nonane
 
Computing for Isogeny Kernel Problem by Groebner Basis
Computing for Isogeny Kernel Problem by Groebner BasisComputing for Isogeny Kernel Problem by Groebner Basis
Computing for Isogeny Kernel Problem by Groebner Basis
Yasu Math
 
暗認本読書会13 advanced
暗認本読書会13 advanced暗認本読書会13 advanced
暗認本読書会13 advanced
MITSUNARI Shigeo
 
量子アニーリングを用いたクラスタ分析
量子アニーリングを用いたクラスタ分析量子アニーリングを用いたクラスタ分析
量子アニーリングを用いたクラスタ分析
Shu Tanaka
 
強化学習その3
強化学習その3強化学習その3
強化学習その3
nishio
 
波動方程式
波動方程式波動方程式
波動方程式
yu sa
 
SuperCon2015予選1級
SuperCon2015予選1級SuperCon2015予選1級
SuperCon2015予選1級
winjii
 
abc032
abc032abc032
abc032
AtCoder Inc.
 
強束縛模型における多体電子状態の第2量子化表現
強束縛模型における多体電子状態の第2量子化表現強束縛模型における多体電子状態の第2量子化表現
強束縛模型における多体電子状態の第2量子化表現
Kazu Ghalamkari
 
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
RCCSRENKEI
 
20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算
matsumoring
 

Similar to University CodeSprint 4 - Magic value (20)

暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながり
 
場の量子論
場の量子論場の量子論
場の量子論
 
グレブナー基底輪読会 #1 ―準備体操の巻―
グレブナー基底輪読会 #1 ―準備体操の巻―グレブナー基底輪読会 #1 ―準備体操の巻―
グレブナー基底輪読会 #1 ―準備体操の巻―
 
表現論 ゼミ資料
表現論 ゼミ資料表現論 ゼミ資料
表現論 ゼミ資料
 
(文献紹介) 画像復元:Plug-and-Play ADMM
(文献紹介) 画像復元:Plug-and-Play ADMM(文献紹介) 画像復元:Plug-and-Play ADMM
(文献紹介) 画像復元:Plug-and-Play ADMM
 
Prml 最尤推定からベイズ曲線フィッティング
Prml 最尤推定からベイズ曲線フィッティングPrml 最尤推定からベイズ曲線フィッティング
Prml 最尤推定からベイズ曲線フィッティング
 
代数方程式とガロア理論
代数方程式とガロア理論代数方程式とガロア理論
代数方程式とガロア理論
 
コンピュータビジョン最先端ガイド6 第2章:4~4.2節
コンピュータビジョン最先端ガイド6 第2章:4~4.2節コンピュータビジョン最先端ガイド6 第2章:4~4.2節
コンピュータビジョン最先端ガイド6 第2章:4~4.2節
 
Computing for Isogeny Kernel Problem by Groebner Basis
Computing for Isogeny Kernel Problem by Groebner BasisComputing for Isogeny Kernel Problem by Groebner Basis
Computing for Isogeny Kernel Problem by Groebner Basis
 
暗認本読書会13 advanced
暗認本読書会13 advanced暗認本読書会13 advanced
暗認本読書会13 advanced
 
確率解析計算
確率解析計算確率解析計算
確率解析計算
 
量子アニーリングを用いたクラスタ分析
量子アニーリングを用いたクラスタ分析量子アニーリングを用いたクラスタ分析
量子アニーリングを用いたクラスタ分析
 
強化学習その3
強化学習その3強化学習その3
強化学習その3
 
波動方程式
波動方程式波動方程式
波動方程式
 
SuperCon2015予選1級
SuperCon2015予選1級SuperCon2015予選1級
SuperCon2015予選1級
 
abc032
abc032abc032
abc032
 
強束縛模型における多体電子状態の第2量子化表現
強束縛模型における多体電子状態の第2量子化表現強束縛模型における多体電子状態の第2量子化表現
強束縛模型における多体電子状態の第2量子化表現
 
第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)第15回 配信講義 計算科学技術特論B(2022)
第15回 配信講義 計算科学技術特論B(2022)
 
20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算20170327_レムニスケートにまつわる色々な計算
20170327_レムニスケートにまつわる色々な計算
 

University CodeSprint 4 - Magic value