0Pricing
Competitive Programming Academy · レッスン

累積和配列を構築する

累積合計を一度だけ前計算します

「累積和配列を構築する」はCoddyKit上の無料Competitive Programming Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCompetitive Programming Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Competitive Programming Academyコースには全4レッスンが含まれています。

繰り返し行う合計の問題

1つの配列に対して、何百回も区間和を求める場面を考えてみましょう。各区間を毎回最初から合計すると遅くなります。これを解決するのが 累積和です。🚀

累積和とは

累積和配列には、各インデックスまでのすべての要素の合計を、それぞれの位置に保存します。事前計算を1回行うだけで、遅い合計処理を即座に答えられる処理へ変えられます。

小さな例

[3, 1, 4] の場合、途中の合計は3、次に4、最後に8です。この増えていく合計のリストが、まさに累積和です。

基本となる漸化式

各要素は、1つ前の合計に現在の要素を加えたものです。この1行の漸化式が、技法全体の中心になります。

prefix[i] = prefix[i - 1] + a[i]

コードで構築する

配列を1回走査し、途中の合計を保持します。各ステップで新しい合計を追加するため、配列の構築は1回の線形走査で完了します。

prefix = [0]
for x in a:
    prefix.append(prefix[-1] + x)

先頭に0を置く利点

累積和の先頭に0を置くと、prefix[i] が最初の i 個の要素の合計を保持する形になります。これにより、後で区間の計算を簡潔にできます。

インデックスの規則

先頭に0を置く場合、prefix[k] は a[0] + ... + a[k-1] と等しくなります。この規則を正しく保つことで、厄介な off-by-one バグを防げます。

構築にかかるコスト

累積和配列の構築では各要素に1回ずつ触れるため、時間計算量は O(n) です。このコストは1回だけ支払い、その後は何度でも再利用できます。

1回前計算して何度も問い合わせる

大きな利点は、このトレードオフです。最初に1回の線形走査を行うことで、その後の合計の問い合わせをループではなく高速な参照にできます。

Pythonらしい短縮方法

標準ライブラリを使えば、合計を自動的に構築できます。itertools.accumulate は、途中の合計を1回の簡潔な呼び出しで生成します。

from itertools import accumulate
prefix = [0] + list(accumulate(a))

メモリに注意する

累積和配列の長さは、入力と同じ長さに1を加えたものです。入力が非常に大きい場合は、メモリ使用量が倍増することを覚えておいてください。

確認問題

累積和配列を構築します。通常、インデックス0には何が入りますか。

まとめ

先頭に0を置き、1回の O(n) の走査で累積和配列を構築する方法を学びました。1回前計算して、その後は再利用します。✅

よくある質問

「累積和配列を構築する」レッスンは無料ですか?

はい。「累積和配列を構築する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Competitive Programming Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Competitive Programming Academyコースには全4レッスンが含まれています。

「累積和配列を構築する」で何を学びますか?

累積合計を一度だけ前計算します ブラウザで直接実行するハンズオンコードでCompetitive Programming Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Competitive Programming Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCompetitive Programming Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「累積和配列を構築する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCompetitive Programming Academyレッスンでコードを書いて実行できますか?

はい。すべてのCompetitive Programming Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 累積和配列を構築する
  2. 引き算で任意の範囲を合計する
  3. 目標の合計を持つ部分配列を数える
  4. 区間更新のための差分配列
← Competitive Programming Academyに戻る