前綴和與差分


該隨筆為基礎內容,想要了解拓展知識可以點 這里

---算法簡介

  問題一:有 $n$ 個數,現在有 $m$ 個操作,分為兩種類型:

    1. 每一次要求將第 $k$ 個數加上 $a$;

    2. 查詢第 $k$ 個數字的值。

  $1 ≤ k ≤ n ≤ 10^5$。

  這一題其實用一個數組就可以維護。

 

  問題二:有 $n$ 個數,並且有 $m$ 次操作,每一次操作要求查詢第 $x$ 個數到第 $y$ 個數的和。

  $1 ≤ x ≤ y ≤ n,m ≤ 10^7$。

  如果用暴力或帶 $\log$ 的算法做那么肯定是會 TLE 的,需要設計一個線性復雜度的算法。

  令

$$S(i)=\sum_{i=1}^na_i$$

  那么第 $x$ 到第 $y$ 個數的和就是 $S(y)-S(x-1)$。 

  而 $S(i)=S(i-1)+a_i$,所以 $S(1)$ 到 $S(n)$ 可以在 $O(n)$ 的復雜度遞推出來。

  對於每次詢問,便可 $O(1)$ 求出了。

 

  問題三:有已賦值的 $n$ 個數,現在有 $m$ 個指令,第 $i$ 個指令要求將第 $x_i$ 個數到第 $y_i$ 個數的每個數加上 $k$,最后求所有數的值。

  $1 ≤ x_i ≤ y_i ≤ n,m ≤ 10^7$,$1 \le k \le 10^9$。

  我們也可以用與前綴和類似的方法解決此題。

  令

$$f(i)=a_{i}-a_{i-1}$$
$$S(i)=\sum_{i=1}^nf_i$$

  然后就會發現,對於 $1 \le i \le n$ 的正整數 $i$,均有 $S(i)=a_i$。

  而當區間 $[x_i,y_i]$ 被加上相同的數時,$f$ 數組中只有 $f_{x_i}$ 和 $f_{y_i+1}$ 發生了改變。

  所以每次讓區間 $[x_i,y_i]$ 每個數加上 $k$ 后,把 $f_{x_i}$ 加上 $k$,$f_{y_i+1}$減去 $k$,最后使用前綴和時這個 $k$ 就可以覆蓋整個區間而不重不漏。、

  復雜度仍為 $O(n+m)$。 

該隨筆為基礎內容,想要了解拓展知識可以點 這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM