建表步數:0
已完成查詢數:0
上列為索引(0..n),中列為原陣列 arr,下列為前綴和 prefix;prefix 尚未計算的格顯示空白。
想像你在記帳,常要問「這個月第 10 天到第 20 天總共花了多少」。若每次都把那幾天一筆筆重加,問幾次就重算幾次,很累。前綴和的訣竅是先記好「從開頭到每一天的累積花費」,之後任一段區間只要拿兩個累積數相減就有答案。差分則反過來:當你想一次幫一整段日子都加同一筆預算,不必逐天改,只在頭尾各動一個記號就好。兩者是一體兩面的取捨——一個把力氣花在「讓查詢變快」,一個花在「讓更新變快」。下面你會看到這兩種技巧各自的建表與查詢/更新過程逐格動起來。
前綴和(Prefix Sum)與差分陣列(Difference Array)是一對互逆的區間處理技巧:
prefix[r+1] - prefix[l])。適合陣列不太變動、但要反覆問「這段區間加起來是多少」的情境。diff[l] += val; diff[r+1] -= val),代價是要看最終結果時得花 O(n) 做一次前綴和把陣列還原。適合要反覆對區間做更新、但只需要偶爾看一次結果的情境。
先建表 prefix[i] = prefix[i-1] + arr[i-1](prefix[0] = 0),
之後查詢區間 [l, r] 的和只要 prefix[r+1] - prefix[l],不必重新掃描區間。
先建差分表 diff[0] = arr[0]、diff[i] = arr[i] - arr[i-1];
每次區間 [l, r] 加值只要改兩個位置:diff[l] += val、diff[r+1] -= val(若 r+1 越界則不寫);
最後用前綴和把 diff 還原回實際陣列 res。