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
競技プログラミングにおける微分積分
Search
physics0523
July 11, 2023
0
840
競技プログラミングにおける微分積分
このスライドは 2023/07/11 に UV Study : ビアバッシュ!競技プログラミングLT会 にて使用されたものです。
physics0523
July 11, 2023
Tweet
Share
More Decks by physics0523
See All by physics0523
競プロにおける「実験コード」の書き方
physics0523
0
2.1k
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
KATA
mclloyd
29
14k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
Done Done
chrislema
181
16k
Typedesign – Prime Four
hannesfritz
40
2.4k
It's Worth the Effort
3n
183
27k
Transcript
競技プログラミングにおける微分積分 physics0523
自己紹介 physics0523 (Algo四段、Heu二段) 所属: 京都大学 工学部電気電子工学科 学部3回生 AtCoder Beginner Contest
の Writer もしています (ABC200~) コンテスト出場歴: ・SuperCon2018 優勝 ・パソコン甲子園2019 準優勝 ・JOI春合宿参加 (’19, ‘20) ・ICPC 2023 Asia Yokohama Regional 出場 (勝ちたい…!)
「競プロ」での微積分のイメージ? 競技プログラミングにおいて微積分と聞いてもイメージが湧きにくい 実際、微積分が競プロで直接要求されることはそう多くはない しかし、競プロには微積分を知っておくと便利な場面がいくつもある 今回は、そのような場面をいくつか紹介していく
「積分」と「微分」 そもそも「積分」と「微分」って何だっけ? 超ざっくり説明すると 積分: 微小な領域を単位として、足し合わせていく行為 微分: 微小な変化をさせた時、その差に着目する行為 積分と微分とは逆演算の関係にある
「累積和」と「差分」 そもそも「累積和」と「差分」って何だっけ? 超ざっくり説明すると 累積和: 数列の各項を足し合わせていく行為 差分: 数列の各項の差に着目する行為 累積和と差分とは逆演算の関係にある
気づきを得る 先ほどの2枚のスライドを見て気づくことがある 「微分」「積分」「累積和」「差分」の4つにはよく似た関係がある 累積和: 𝑆𝑘 = σ 𝑖=1 𝑘 𝐴𝑖
←逆演算→ 差分: 𝐴𝑖 = 𝑆𝑖 − 𝑆𝑖−1 連続↓ ↑離散 積分: 𝐹 𝑥 = 𝑓 𝑥 𝑑𝑥 ←逆演算→ 微分 𝑓 𝑥 = (𝐹(𝑥))′ この関係を踏まえると imos 法が導ける
imos 法の導出 やりたいこと: 「𝐴𝑙 , 𝐴𝑙+1 , … , 𝐴𝑟
に 𝐶 を加算」をたくさん捌きたい 「差分と累積和が逆演算にあるので、差分を取っても後で累積和を取 れば元に戻せること」を踏まえて議論する 𝐷𝑖 = 𝐴𝑖 − 𝐴𝑖−1 として 「𝐴𝑙 , 𝐴𝑙+1 , … , 𝐴𝑟 に 𝐶 を加算」 という操作の差分 をとってみると 「𝐷𝑙 に 𝐶 加算、 𝐷𝑟+1 から 𝐶 減算」となる これにより 𝑟 − 𝑙 + 1 項に対する操作が 2 項になった この操作をたくさん捌いたあと、最後に累積和を取って元に戻してや れば目的の操作が実現できることが分かる
等差数列の足し込み 考え方を発展させると、以下のようなクエリも捌くことができる やりたいこと: 「𝐴𝑙 , 𝐴𝑙+1 , … , 𝐴𝑟
に 1,2, … , (𝑟 − 𝑙 + 1) を加算」をたくさん 捌きたい この差分を取ると 「 𝐷𝑙 , 𝐷𝑙+1 , … , 𝐷𝑟 に 1 加算、 𝐷𝑟+1 に −(𝑟 − 𝑙 + 1) 加算」となる Q. ここからどうすれば? A. 差分の差分 𝐸𝑖 = 𝐷𝑖 − 𝐷𝑖−1 をとってやればよい! これは微分積分でいう 2階微分を考える行為
等差数列の足し込み 「 𝐷𝑙 , 𝐷𝑙+1 , … , 𝐷𝑟 に
1 加算」の差分を取ると 「 𝐸𝑙 に 1 加算、 𝐸𝑟+1 から 1 減算」 となる これで準備は整った 各クエリに対して 「 𝐸𝑙 に 1 加算、 𝐸𝑟+1 から 1 減算」 「 𝐷𝑟+1 に −(𝑟 − 𝑙 + 1) 加算」 をしたうえで 𝐸 から 𝐷 を復元、 𝐷 から 𝐴 の復元ができる このように、「差分の差分」のような概念を考えてやるとうまくできる操 作もある
「微小変化」に着目する 例題: 数直線上に住民が 𝑁 人居て、各人は座標 𝑋𝑖 に住んでいる。 ここにコンビニを 1 店作る。
座標 𝑌 にコンビニを出店した時の不便さは |𝑌 − 𝑋𝑖 | の全ての住民に 対する和である。 達成可能な最小の不便さを求めよ。 𝑁 ≤ 3 × 105
「微小変化」に着目する 店の座標を 𝑦 から 𝑦 + ∆𝑦 に微小変化させたとき、不便さはどのよう に変化するか考える (この座標変化は住民を跨がないものとする)
住民の座標を 𝑥 として 𝑥 ≤ 𝑦 のとき … その住民に対して不便さは ∆𝑦 増加 そうでないとき … その住民に対して不便さは ∆𝑦 減少 結局この変化によって起きた不便さの変化は? 𝑥 ≤ 𝑦 を満たす住人の数を 𝑝 、満たさない住民の数を 𝑞 としたとき (𝑝 − 𝑞)∆𝑦 増加
「微小変化」に着目する 前頁の 𝑝 − 𝑞 が(広義)単調増加することを踏まえると、住民の座標 の中央値に出店することが最適であることが証明できる (更に、住民が偶数人である場合は真ん中の 2 人の間ならどこに出店
してもいいことも分かる) このように、微小変化に対して議論をすることで解法が証明できること がそこそこある
計算量の証明 (調和級数) 以下のループの計算量は? for(i = 1; i <= N; i++){
for(int j = i; j <= N; j+=i){ // 処理 } } 1 以上 N 以下の各 i に対して i の倍数のみを渡るループ 実はこのループは 𝑂 𝑁 log 𝑁 で実行可能!
計算量の証明 (調和級数) 先ほどの計算量の証明が積分を駆使するとできる! (青より下の面積)≦長方形の面積の合計≦(赤より下の面積)より 𝑁 1 𝑁 1 𝑥
𝑑𝑥 ≤ 𝑁 1 + 𝑁 2 + 𝑁 3 + ⋯ + 𝑁 𝑁 ≤ 𝑁 1 + 2 𝑁 1 (𝑥−1) 𝑑𝑥 1 𝑁 1 𝑥 𝑑𝑥 = log 𝑥 1 𝑁 = log 𝑁 より 不等式の両端が 𝑂(𝑁 log 𝑁) であると言える このことから、真ん中も 𝑂(𝑁 log 𝑁) (但し、これは略証。本当は床関数が付くのでそれを外す作業が必要)
平方分割の最適化 慣れた競技プログラマーなら「平方分割ガチャ」という単語を聞いたこ とがあるはず 実は「微分積分」を使うとこのガチャが楽になるかもしれない
平方分割の最適化 問題設定: 𝑁 個の要素を 𝑥 分割する。 分割した個数に依存して重くなる処理のコストは 𝐴 分割した各部分の大きさに依存して重くなる処理のコストは 𝐵
と評価できることから、実行時間は 𝑓 𝑥 = 𝐴𝑥 + 𝑁𝐵 𝑥 と書き表せる。これを最小化せよ。
平方分割の最適化 関数の最小値を調べたい時は微分して増減表! 𝑓 𝑥 = 𝐴𝑥 + 𝑁𝐵 𝑥 なので
𝑓′ 𝑥 = 𝐴 − 𝑁𝐵 𝑥2 𝑥 > 0 の範囲で 𝑓′ 𝑥 = 0 なる 𝑥 は 𝐴𝑥2 − 𝑁𝐵 = 0 より 𝑥 = 𝑁𝐵 𝐴 増減表より 𝑥 = 𝑁𝐵 𝐴 が最適な分割であることが分かる 𝐴 = 𝐵 を仮定すると最適な分割は 𝑥 = 𝑁 となり、普通の平方分割と一致する 𝐴, 𝐵 が定数でなく log 𝑥 などでも計算が変わるだけで同様の考え方が使える 𝑥 𝑁𝐵/𝐴 𝑓′(𝑥) − 0 + 𝑓(𝑥) ↘ ↗
入りきらなかったトピック ・数値積分 ・PCK, ICPC系コンテストでたまに目にします ・連続型確率変数を取り扱う ・ABC終盤、ARCの中盤から終盤でたまに目にします ・WTF2019 e (2718点問題) では積分必須です
・最適化への各種応用 ・Heuristic 系に頼らずとも微分で解けたりすることも少なくないです
まとめ Q. 「競プロに微積分って必要なんですか?」 A. 「直接的に微積分が問われることはそんなに多くない。しかし、 ・解法の証明に役に立つ ・最適化が直接解ける ・計算量の解析がうまくできる ・微積分の考え方自体が役に立つ ことがあるので触れておいて損はない!」