2. 板子
2.2 差分
3. 板子
定義
s[n] = ∑i=
1na[
i]
\sum_^na[i]
∑i=1n
a[i]
遞推關係
s[i] = a[i] + s[i - 1]
區間求和
∑ i=
lra[
i]=s
[r]−
s[l−
1]
\sum_^ra[i] = s[r] - s[l - 1]
∑i=lr
a[i]
=s[r
]−s[
l−1]
定義
存在兩個陣列a(a1, a2, a3,…, an)和b(b1, b2, … ,bn)
如果ai = b1 + b2 + … + bi
那麼b稱為a的差分(比如: b1 = a1, b2 = a2 - a1)
作用
區間增加->單點修改:當a[l]~a[r]這個區間內元素全加上c時,只需要對b[l] + c, b[r+1] - c即可,因為:b[l] + c:讓a[l]往後的元素全部加上c。b[r+1]-c:防止a[r+1]開始往後的元素加上c
一開始給ai賦值時,可以看成是給a[i]~a[i]這段全部加上c
構造
差分的構造可以選擇: b[i] = a[i] - a[i - 1]
變形
差分可以維護a的變化值,即b[i] = δai = $ \sum_^nb[i] $
2.1.1 一維字首和
#include
using
namespace std;
intconst n =
1e5+10;
int s[n]
, a[n]
;int
main()
// 使用字首和
for(
int i =
0; i < k ;
++i)
return0;
}
2.1.2 二維字首和#include
using
namespace std;
intconst n =
1e3+10;
int s[n]
[n], a[n]
[n];
intmain()
for(
int i =
0; i < k;
++i)
return0;
}
2.2.1 一維差分#include
using
namespace std;
intconst n =
1e5+10;
int b[n]
, n, m, a[n]
;// 區間修改
void
insert
(int l,
int r,
int c)
intmain()
for(
int i =
1; i <= n;
++i)
return0;
}
2.2.1 二維差分#include
using
namespace std;
intconst n =
1e3+10;
int a[n]
[n], b[n]
[n];
int n, m, q;
// 區間增加(二維情況)--和字首和情況不一樣
void
insert
(int l1,
int r1,
int l2,
int r2,
int c)
intmain()
for(
int i =
1, l1, r1, l2, r2, c; i <= q;
++i)
for(
int i =
1; i <= n;
++i)
printf
("\n");
}return0;
}
acwing1230. k倍區間
題意:給定乙個長度為 n 的數列,a1,a2,…an,如果其中一段連續的子串行 ai,ai+1,…aj 之和是 k 的倍數,我們就稱這個區間 [i,j] 是 k 倍區間。求出數列中總共有多少個 k 倍區間。
題意:(sum[r] - sum[l - 1]) % k == 0,則sum[r] % k == sum[l - 1] % k。因此只需要找到字首和%k相等的個數即可,同時要注意l<=r,則l - 1 < r, 同時記得加上左邊界不選的情況。
**:
#include
using
namespace std;
intconst n =
1e5+10;
long
long sum[n]
, a[n]
, n, k, cnt[n]
;int
main()
cout << res << endl;
return0;
}
字首和 差分與樹上差分
1.1 字首和 字首和可以通過對乙個序列進行o n 的預處理後,在o 1 時間內求出任意乙個子串行的和。1.2 差分 可以用於求解多次區間修改與區間詢問的題型,例如多次次給 l r 內所有數 val,就可以用差分以及字首和來優化。區間操作o 1 區間詢問o n 處理,o 1 查詢。1.3 樹上差分 ...
字首和與差分
數列的字首和 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...