字首和 差分

2021-10-04 10:44:29 字數 1161 閱讀 1820

有n個數和q次操作,每一次操作指明了要操作的區間[l,r],以及讓該區間內的所有元素全部加c

輸出q次操作後所有元素的大小

第一行 n q (1≤n,q≤2⋅105)

第二行 n個數 a1,a2······an (−106≤ai≤106)

接下來q 行 每行3個數

l r c 表示 [l,r]區間內每個數加c(1≤l≤r≤n,−105≤c≤105)

進行完q次操作後,所有元素的值

42-

3684

44-2

331

-36

92

1.對陣列a,先進行差分得到陣列b 即b[1]=a[1] b[i]=a[i]-a[i-1]

b[1]

=a[1];

for(

int i=

2;i<=n;i++

) b[i]

=a[i]

-a[i-1]

;

2.對陣列a進行區間操作轉化為對陣列b的單點操作 即 b[l]+=q b[r+1]-=q

b[l]

+=q; b[r+1]

-=q;

3.當操作完後 對陣列b求字首和s 再輸出字首和 即得到操作後的a陣列

s[1]=b[1] s[i]=s[i-1]+b[i]

long

long tmp;

for(

int i=

1;i<=n;i++

)

#include

#include

using

namespace std;

long

long a[

200100];

long

long b[

200100];

// 資料很多 ------- 要用scanf ,其次 long long防止溢位

intmain()

long

long tmp;

for(

int i=

1;i<=n;i++

)return0;

}

字首和 差分

數列的字首和 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 ...

字首和 差分

顧名思義 用某乙個陣列來記錄陣列a前i項和,這個還可以用來求區間 l,r 的和 s r s l 1 因為第l項也在區間內 話不多說,直接上例題 leetcode 5393 ac const int maxn 1e5 5 class solution int ans 0 for int i 0 i k...

差分字首和

如果我給你一串長度為n的數列a1,a2,a3 an,再給出m個詢問,每次詢問給出l,r兩個數,要求給出區間 l,r 裡的數的和,你會怎麼做,若是沒有了解過字首和的人看到這道題的想法可能是對於m次詢問,我每次都遍歷一遍它給的區間,計算出答案,這樣子的方法固然沒錯,但是用了兩個迴圈,其時間複雜度達到了o...