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
890
競技プログラミングにおける微分積分
このスライドは 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 Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Building Your Own Lightsaber
phodgson
104
6.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Mobile First: as difficult as doing things right
swwweet
223
9.5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
How to Think Like a Performance Engineer
csswizardry
22
1.4k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Automating Front-end Workflow
addyosmani
1369
200k
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. 「直接的に微積分が問われることはそんなに多くない。しかし、 ・解法の証明に役に立つ ・最適化が直接解ける ・計算量の解析がうまくできる ・微積分の考え方自体が役に立つ ことがあるので触れておいて損はない!」