字首和與差分

2022-07-20 00:03:28 字數 1112 閱讀 4150

問題一:有 $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_^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_-a_$$

$$s(i)=\sum_^nf_i$$

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

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

所以每次讓區間 $[x_i,y_i]$ 每個數加上 $k$ 後,把 $f_$ 加上 $k$,$f_$減去 $k$,最後使用字首和時這個 $k$ 就可以覆蓋整個區間而不重不漏。、

複雜度仍為 $o(n+m)$。 

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

字首和與差分

數列的字首和 sum i 表示a 1 a i 的和 用處1 求i j的和sum j sum i 1 用處2 區間修改。設定乙個change陣列。當區間 i,j 上要加k時,我們令change i k,令change j 1 k。如果我們對change陣列求字首和的話,字首和sum change i ...

字首和與差分

從陣列第乙個開始累加 s i s i 1 a i 求區間 l,r 的和,o 1 複雜度sum s r s l 1 遞推s i j s i j s i 1 j s i j 1 s i 1 j 1 例題 雷射炸彈一種新型的雷射炸彈,可以摧毀乙個邊長為r的正方形內的所有的目標。現在地圖上有n n 1000...

字首和與差分

例題入口 include const int n 320 int a n n a i 1 a i 0 1.對a 求出平方數 將其值置為1 不是平方數就是0 2.對a求乙個字首和 3.對 a,b 求乙個部分和 int sum n n void init for int i 1 i 100000 i i...