字首與差分

2021-10-09 13:34:06 字數 2871 閱讀 3104

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...