← 回首頁

前綴和與差分

想像你在記帳,常要問「這個月第 10 天到第 20 天總共花了多少」。若每次都把那幾天一筆筆重加,問幾次就重算幾次,很累。前綴和的訣竅是先記好「從開頭到每一天的累積花費」,之後任一段區間只要拿兩個累積數相減就有答案。差分則反過來:當你想一次幫一整段日子都加同一筆預算,不必逐天改,只在頭尾各動一個記號就好。兩者是一體兩面的取捨——一個把力氣花在「讓查詢變快」,一個花在「讓更新變快」。下面你會看到這兩種技巧各自的建表與查詢/更新過程逐格動起來。

前綴和(Prefix Sum)與差分陣列(Difference Array)是一對互逆的區間處理技巧:

換句話說:前綴和用「建表換查詢」,差分用「建表換更新」;差分陣列本身就是原陣列的一階差分,還原時做的前綴和正好是前綴和技巧的逆運算。

1. 前綴和(Prefix Sum)— 區間查詢 O(1)

先建表 prefix[i] = prefix[i-1] + arr[i-1]prefix[0] = 0), 之後查詢區間 [l, r] 的和只要 prefix[r+1] - prefix[l],不必重新掃描區間。

陣列(逗號分隔,2–10 個整數,每個 0–99): 查詢 l(0-indexed): 查詢 r(0-indexed,含端點):
建表步數:0 已完成查詢數:0
上列為索引(0..n),中列為原陣列 arr,下列為前綴和 prefix;prefix 尚未計算的格顯示空白。

2. 差分陣列(Difference Array)— 區間更新 O(1)

先建差分表 diff[0] = arr[0]diff[i] = arr[i] - arr[i-1]; 每次區間 [l, r] 加值只要改兩個位置:diff[l] += valdiff[r+1] -= val(若 r+1 越界則不寫); 最後用前綴和把 diff 還原回實際陣列 res

陣列(逗號分隔,2–10 個整數,每個 0–99):
操作 l: 操作 r: 加值 val(-20~20):
寫入次數:0
上列為索引(0..n-1),第二列為原陣列 arr,第三列為差分 diff,第四列為還原後的 res;橘色格為本步驟剛寫入的格,未算格顯示空白。