Upgrade to Pro — share decks privately, control downloads, hide ads and more …

競技プログラミングにおける微分積分

physics0523
July 11, 2023
730

 競技プログラミングにおける微分積分

このスライドは 2023/07/11 に UV Study : ビアバッシュ!競技プログラミングLT会 にて使用されたものです。

physics0523

July 11, 2023
Tweet

Transcript

  1. 自己紹介 physics0523 (Algo四段、Heu二段) 所属: 京都大学 工学部電気電子工学科 学部3回生 AtCoder Beginner Contest

    の Writer もしています (ABC200~) コンテスト出場歴: ・SuperCon2018 優勝 ・パソコン甲子園2019 準優勝 ・JOI春合宿参加 (’19, ‘20) ・ICPC 2023 Asia Yokohama Regional 出場 (勝ちたい…!)
  2. 気づきを得る 先ほどの2枚のスライドを見て気づくことがある 「微分」「積分」「累積和」「差分」の4つにはよく似た関係がある 累積和: 𝑆𝑘 = σ 𝑖=1 𝑘 𝐴𝑖

    ←逆演算→ 差分: 𝐴𝑖 = 𝑆𝑖 − 𝑆𝑖−1 連続↓ ↑離散 積分: 𝐹 𝑥 = ׬ 𝑓 𝑥 𝑑𝑥 ←逆演算→ 微分 𝑓 𝑥 = (𝐹(𝑥))′ この関係を踏まえると imos 法が導ける
  3. imos 法の導出 やりたいこと: 「𝐴𝑙 , 𝐴𝑙+1 , … , 𝐴𝑟

    に 𝐶 を加算」をたくさん捌きたい 「差分と累積和が逆演算にあるので、差分を取っても後で累積和を取 れば元に戻せること」を踏まえて議論する 𝐷𝑖 = 𝐴𝑖 − 𝐴𝑖−1 として 「𝐴𝑙 , 𝐴𝑙+1 , … , 𝐴𝑟 に 𝐶 を加算」 という操作の差分 をとってみると 「𝐷𝑙 に 𝐶 加算、 𝐷𝑟+1 から 𝐶 減算」となる これにより 𝑟 − 𝑙 + 1 項に対する操作が 2 項になった この操作をたくさん捌いたあと、最後に累積和を取って元に戻してや れば目的の操作が実現できることが分かる
  4. 等差数列の足し込み 考え方を発展させると、以下のようなクエリも捌くことができる やりたいこと: 「𝐴𝑙 , 𝐴𝑙+1 , … , 𝐴𝑟

    に 1,2, … , (𝑟 − 𝑙 + 1) を加算」をたくさん 捌きたい この差分を取ると 「 𝐷𝑙 , 𝐷𝑙+1 , … , 𝐷𝑟 に 1 加算、 𝐷𝑟+1 に −(𝑟 − 𝑙 + 1) 加算」となる Q. ここからどうすれば? A. 差分の差分 𝐸𝑖 = 𝐷𝑖 − 𝐷𝑖−1 をとってやればよい! これは微分積分でいう 2階微分を考える行為
  5. 等差数列の足し込み 「 𝐷𝑙 , 𝐷𝑙+1 , … , 𝐷𝑟 に

    1 加算」の差分を取ると 「 𝐸𝑙 に 1 加算、 𝐸𝑟+1 から 1 減算」 となる これで準備は整った 各クエリに対して 「 𝐸𝑙 に 1 加算、 𝐸𝑟+1 から 1 減算」 「 𝐷𝑟+1 に −(𝑟 − 𝑙 + 1) 加算」 をしたうえで 𝐸 から 𝐷 を復元、 𝐷 から 𝐴 の復元ができる このように、「差分の差分」のような概念を考えてやるとうまくできる操 作もある
  6. 「微小変化」に着目する 例題: 数直線上に住民が 𝑁 人居て、各人は座標 𝑋𝑖 に住んでいる。 ここにコンビニを 1 店作る。

    座標 𝑌 にコンビニを出店した時の不便さは |𝑌 − 𝑋𝑖 | の全ての住民に 対する和である。 達成可能な最小の不便さを求めよ。 𝑁 ≤ 3 × 105
  7. 「微小変化」に着目する 店の座標を 𝑦 から 𝑦 + ∆𝑦 に微小変化させたとき、不便さはどのよう に変化するか考える (この座標変化は住民を跨がないものとする)

    住民の座標を 𝑥 として 𝑥 ≤ 𝑦 のとき … その住民に対して不便さは ∆𝑦 増加 そうでないとき … その住民に対して不便さは ∆𝑦 減少 結局この変化によって起きた不便さの変化は? 𝑥 ≤ 𝑦 を満たす住人の数を 𝑝 、満たさない住民の数を 𝑞 としたとき (𝑝 − 𝑞)∆𝑦 増加
  8. 計算量の証明 (調和級数) 以下のループの計算量は? for(i = 1; i <= N; i++){

    for(int j = i; j <= N; j+=i){ // 処理 } } 1 以上 N 以下の各 i に対して i の倍数のみを渡るループ 実はこのループは 𝑂 𝑁 log 𝑁 で実行可能!
  9. 計算量の証明 (調和級数) 先ほどの計算量の証明が積分を駆使するとできる! (青より下の面積)≦長方形の面積の合計≦(赤より下の面積)より 𝑁 ׬ 1 𝑁 1 𝑥

    𝑑𝑥 ≤ 𝑁 1 + 𝑁 2 + 𝑁 3 + ⋯ + 𝑁 𝑁 ≤ 𝑁 1 + ׬ 2 𝑁 1 (𝑥−1) 𝑑𝑥 ׬ 1 𝑁 1 𝑥 𝑑𝑥 = log 𝑥 1 𝑁 = log 𝑁 より 不等式の両端が 𝑂(𝑁 log 𝑁) であると言える このことから、真ん中も 𝑂(𝑁 log 𝑁) (但し、これは略証。本当は床関数が付くのでそれを外す作業が必要)
  10. 平方分割の最適化 関数の最小値を調べたい時は微分して増減表! 𝑓 𝑥 = 𝐴𝑥 + 𝑁𝐵 𝑥 なので

    𝑓′ 𝑥 = 𝐴 − 𝑁𝐵 𝑥2 𝑥 > 0 の範囲で 𝑓′ 𝑥 = 0 なる 𝑥 は 𝐴𝑥2 − 𝑁𝐵 = 0 より 𝑥 = 𝑁𝐵 𝐴 増減表より 𝑥 = 𝑁𝐵 𝐴 が最適な分割であることが分かる 𝐴 = 𝐵 を仮定すると最適な分割は 𝑥 = 𝑁 となり、普通の平方分割と一致する 𝐴, 𝐵 が定数でなく log 𝑥 などでも計算が変わるだけで同様の考え方が使える 𝑥 𝑁𝐵/𝐴 𝑓′(𝑥) − 0 + 𝑓(𝑥) ↘ ↗