序列演算法 字首和與差分

2021-10-18 11:36:24 字數 1272 閱讀 5394

一般的字首和是對於陣列的求和,即對陣列的某一子陣列進行求和,即sum(i,j) == sum[i] - sum[j-1]

不僅如此字首和還能用於任何含可逆運算的運算子包括異或xor

上述的子陣列和的問題屬於陣列固定,大量訪問的問題優化。

下面給出乙個大量做區間加的情況:

給定乙個序列a 有很多次操作,每個操作形如:a l r k 將a_[l,r]每個值加上k. 最後輸出整個陣列。複雜度要求o(n).

如果用傳統方法,n次操作當lr區間長度達到n就成了o(n^2)了,自然不符合題意。

所以這裡利用到了差分陣列(描述序列元素的遞推關係,以更快的方式體現序列元素的增減)。

對於如下序列:

5 4 7 2 4 3 1
經過如下計算:

1&space;%5c%5c&space;l%5bi%5d&space;=line%5bi%5d&space;&&space;%5ctext%7b&space;%7d&space;i&space;=&space;1&space;%5cend%7bcases%7d" target="_blank" rel="noopener noreferrer">

得到差分陣列:

5 -1 3 -5 2 -1 -2
然後再求差分陣列的字首和可以發現:

sum[i] == line[i]

並且給差分陣列的乙個元素+x後,其後面直到-x的元素(不包括),他們的字首和均+i(即line元素+i),這就回歸到了我們的題目要求上。

由查分陣列的這些性質可以解決更多類似這種問題。

所以**如下:

int n;

//陣列元素個數

int l,r,k;

int a[

100005];

int change[

100005];

int sum[

100005];

void

fun(

int m)

//m次操作

for(

int i =

0;i < m;i++

)//對差分元素進行加減運算

for(

int i =

1;i <= n;i++

)//求差分陣列字首和並輸出

}

字首和與差分 增減序列

給定乙個長度為 nn 的數列 a1,a2,ana1,a2,an,每次可以選擇乙個區間 l,r 使下標在這個區間內的數都加一或者都減一。求至少需要多少次操作才能使數列中的所有數都一樣,並求出在保證最少次數的前提下,最終得到的數列可能有多少種。輸入格式 第一行輸入正整數nn。接下來nn行,每行輸入乙個整...

字首和,差分演算法

其實可以把它理解為數學上的數列的前n項和 對於乙個一維陣列的字首和 我們定義對於乙個陣列a的字首和陣列s,s i a 1 a 2 a i 與一維字首和類似,設s i j 表示所有a i j 的和。1 i i,1 j j 有一點像 矩形的面積 那樣,把一整塊區域的值都加起來。一般用來求區間和。對於一維...

字首和與差分 演算法詳解

1 字首和 其實可以把它理解為數學上的數列的前n項和 對於乙個一維陣列的字首和 我們定義對於乙個陣列a的字首和陣列s,s i a 1 a 2 a i 2 二維字首和 與一維字首和類似,設s i j 表示所有a i j 的和。1 i i,1 j j 有一點像 矩形的面積 那樣,把一整塊區域的值都加起來...