$30 off During Our Annual Pro Sale. View Details »

About累積和

Catupper
August 22, 2013

 About累積和

ぷろ
しゅみ
るいせいき

Catupper

August 22, 2013
Tweet

More Decks by Catupper

Other Decks in How-to & DIY

Transcript

  1. なつやすみは突然に
    ひとなつの
    競技プログラミング講座

    View Slide

  2. ぱちぱちー
    累積和

    View Slide

  3. 問題

    長さ100,000の数列があります

    いろいろな区間についてそこの合計を聞くので答えて
    – 100,000くらい聞く

    例: {1, 4, -1, 2, 5, 9, 10, -4, 5, 0}
    – 0〜7は? → 26
    – 2〜4は? → 6
    – 3〜9は? → 27
    – …

    View Slide

  4. 愚直にやると?

    聞かれるたびにいちいち足して計算する
    – 最悪100,000 * 100,000で 10^10
    – 遅い

    View Slide

  5. そこまでの和をもつの

    累積和という概念をつかうとうまく行く
    – どこかからどこかまでの和のこと
    – 今回は一番左からそこまでの和

    要素A[i]以左の要素の総和をS[i]とする

    A[l] + A[l + 1] + A[l + 2]... A[r] = S[r] – S[l – 1]

    S[i]をすべて保存しておけば一回引き算するだけ
    – 計算は100,000回だけになる

    View Slide

  6. これこそが
    累積和

    View Slide

  7. 基本概念

    連続した範囲の総和を持つこと

    それを使うことで計算量を減らす

    どう使うかはあなたが考える

    View Slide

  8. たったの
    これだけ

    View Slide

  9. 演習問題

    AOJ0549

    一直線上に宿屋がたくさんならんでいる

    旅人がその宿屋をある順番でめぐる

    そのときの総移動距離を求めよ

    簡単なので考えてみて

    View Slide

  10. Thinking Time

    3分で答えを考えてください
    ● コードは実装しなくていいです

    View Slide

  11. 例題
    ● 最初は全部0の数列があります
    – サイズは10,000くらい
    ● 連続した範囲に1足す操作をたくさんします
    – 10,000回くらい
    ● 操作を全部し終わった後の数列の状態を教えて

    View Slide

  12. わかりやすい図

    View Slide

  13. ためされる頭脳
    どうやってとくのか

    View Slide

  14. 逆転の発想

    さっきまでは、状態の累積和をとっていた

    今度はなにかの累積和が状態になるように考える

    元の状態を変えると累積和がどう変わるか考えてみる

    View Slide

  15. +1してみる

    累積和する前のもの

    累積和をとった後

    View Slide

  16. 考察
    ● 累積和前の数列に1を足すとそれ以降全てが一様にたさ
    れる
    ● 連続した範囲に一様に値を足すことの代わりになる
    – だけど余計なところまでたされてしまう
    ● 余計なところは-1して帳尻をあわせる

    View Slide

  17. -1でちょうじりあわせ

    累積和する前のもの

    累積和をとった後

    View Slide

  18. これが港でゆうめいな
    いもす法

    View Slide

  19. 演習問題

    AOJ0231
    ● 重量制限がある崩れそうなヤバイ橋(ヤ橋)がある
    ● その橋を何人かが渡ります
    – それぞれの渡り始め、渡り終わりの時刻
    – それぞれの体重
    – が与えられる
    ● 崩れるか崩れないか判断してください
    ● 崩れるならいつ崩れるか教えてください

    View Slide

  20. Thinking Time

    5分で答えを考えてください
    ● コードは実装しなくていいです
    – ちょっとむずいです
    ● わかった人は前に出て発表
    – 先着1名

    View Slide

  21. 次元をこえて
    2次元への応用

    View Slide

  22. 考え方はいっしょ
    ● 累積和のつよみ
    – 1次元配列よりも2次元配列で本領を発揮する
    ● 考え方は変わらないのでとりあえず例題

    View Slide

  23. 応用問題

    AOJ0560

    Jangle, Ocean, Iceの3種類の地形からなる地図が与えら
    れる
    – 2次元 1000 * 1000のマス目状
    ● ある長方形の範囲の中のJ,O,Iの数を教えてください
    – ということを100,000回します
    ● うまく処理して

    View Slide

  24. 参考までに愚直解
    ● 聞かれるたびにいちいち答えるとクソおそいです
    – 1,000 * 1,000 * 100,000 = 10^11
    – 数分かかる
    ● 今回の問題はO(10^6)でとけます
    – がんばって考えよう

    View Slide

  25. Thinking Time

    5分で答えを考えてください
    ● コードは実装してもいいです
    – 時間かかるのでせんでもいいです
    ● わかった人は前に出て発表
    – 先着1名

    View Slide

  26. 答え

    (0,0)を頂点にする全ての長方形の結果を持っておく
    – 1,000 * 1,000個 → O(10^6)
    – A[i][j]を長方形(0,0) (i, j)の結果とする
    ● 長方形(a,b) (c,d)の結果は
    – A[c, d] - A[a, d] – A[c, b] + A[a, b]
    – 一回の計算で出せる
    – O(100,000)

    View Slide

  27. ちなみに
    日本情報オリンピック
    2010
    本選第一問

    View Slide

  28. 宣伝
    ● 夏休みおわった直後くらいに申し込み始まります
    ● 応募してちょ
    – 無料
    – 参加は家から可能
    – 予選を通れば東京にタダでいける
    – 代表に選ばれれば台湾にタダでいける
    – 来年はカザフスタン

    View Slide

  29. その他応用問題たち

    AOJ0509
    – Sheets
    – メモリの工夫が必要

    AOJ0574
    – Nails
    – DPでもとけます

    AOJ0580
    – Fish
    – 座標圧縮が必要

    View Slide