該隨筆為基礎內容,想要了解拓展知識可以點 這里
---算法簡介
問題一:有 $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)$。
該隨筆為基礎內容,想要了解拓展知識可以點 這里