ぷろ しゅみ るいせいき わ
なつやすみは突然にひとなつの競技プログラミング講座
View Slide
ぱちぱちー累積和
問題●長さ100,000の数列があります●いろいろな区間についてそこの合計を聞くので答えて– 100,000くらい聞く●例: {1, 4, -1, 2, 5, 9, 10, -4, 5, 0}– 0〜7は? → 26– 2〜4は? → 6– 3〜9は? → 27– …
愚直にやると?●聞かれるたびにいちいち足して計算する– 最悪100,000 * 100,000で 10^10– 遅い
そこまでの和をもつの●累積和という概念をつかうとうまく行く– どこかからどこかまでの和のこと– 今回は一番左からそこまでの和●要素A[i]以左の要素の総和をS[i]とする●A[l] + A[l + 1] + A[l + 2]... A[r] = S[r] – S[l – 1]●S[i]をすべて保存しておけば一回引き算するだけ– 計算は100,000回だけになる
これこそが累積和
基本概念●連続した範囲の総和を持つこと●それを使うことで計算量を減らす●どう使うかはあなたが考える
たったのこれだけ
演習問題●AOJ0549●一直線上に宿屋がたくさんならんでいる●旅人がその宿屋をある順番でめぐる●そのときの総移動距離を求めよ●簡単なので考えてみて
Thinking Time●3分で答えを考えてください● コードは実装しなくていいです
例題● 最初は全部0の数列があります– サイズは10,000くらい● 連続した範囲に1足す操作をたくさんします– 10,000回くらい● 操作を全部し終わった後の数列の状態を教えて
わかりやすい図
ためされる頭脳どうやってとくのか
逆転の発想●さっきまでは、状態の累積和をとっていた●今度はなにかの累積和が状態になるように考える●元の状態を変えると累積和がどう変わるか考えてみる
+1してみる●累積和する前のもの●累積和をとった後
考察● 累積和前の数列に1を足すとそれ以降全てが一様にたされる● 連続した範囲に一様に値を足すことの代わりになる– だけど余計なところまでたされてしまう● 余計なところは-1して帳尻をあわせる
-1でちょうじりあわせ●累積和する前のもの●累積和をとった後
これが港でゆうめいないもす法
演習問題●AOJ0231● 重量制限がある崩れそうなヤバイ橋(ヤ橋)がある● その橋を何人かが渡ります– それぞれの渡り始め、渡り終わりの時刻– それぞれの体重– が与えられる● 崩れるか崩れないか判断してください● 崩れるならいつ崩れるか教えてください
Thinking Time●5分で答えを考えてください● コードは実装しなくていいです– ちょっとむずいです● わかった人は前に出て発表– 先着1名
次元をこえて2次元への応用
考え方はいっしょ● 累積和のつよみ– 1次元配列よりも2次元配列で本領を発揮する● 考え方は変わらないのでとりあえず例題
応用問題●AOJ0560●Jangle, Ocean, Iceの3種類の地形からなる地図が与えられる– 2次元 1000 * 1000のマス目状● ある長方形の範囲の中のJ,O,Iの数を教えてください– ということを100,000回します● うまく処理して
参考までに愚直解● 聞かれるたびにいちいち答えるとクソおそいです– 1,000 * 1,000 * 100,000 = 10^11– 数分かかる● 今回の問題はO(10^6)でとけます– がんばって考えよう
Thinking Time●5分で答えを考えてください● コードは実装してもいいです– 時間かかるのでせんでもいいです● わかった人は前に出て発表– 先着1名
答え●(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)
ちなみに日本情報オリンピック2010本選第一問
宣伝● 夏休みおわった直後くらいに申し込み始まります● 応募してちょ– 無料– 参加は家から可能– 予選を通れば東京にタダでいける– 代表に選ばれれば台湾にタダでいける– 来年はカザフスタン
その他応用問題たち●AOJ0509– Sheets– メモリの工夫が必要●AOJ0574– Nails– DPでもとけます●AOJ0580– Fish– 座標圧縮が必要