差分陣列的總結

2021-07-25 05:42:05 字數 919 閱讀 6144

差分陣列的資料網上不太好找,蒟蒻表示網上學習這個自認為比較簡單的技巧是比較麻煩的,於是蒟蒻覺得自己寫下學習總結。

部落格上看拉個題目意思大概是:

給定乙個長度為n的序列: 首先進行x次操作,每次操作在li和ri這個區間加上乙個數ci。

然後進行y次詢問,每次詢問li到ri的區間和。

初始序列都為0。

1<=n<=1000000,1<=x<=n, x<=y<=n

1<=li<=n,li<=ri<=n,|ci|<=100000000000000

很多人第一眼看到這個題目第一反應都是線段樹的裸題?但是本人認為線段樹對於蒟蒻來說在大考中**實現複雜,如果寫的不太熟悉的話,運用大量時間去實現其是不夠理智的,不過對於這個題利用差分陣列解題是個不錯的選擇。

差分陣列(差分數列):

對於乙個陣列a[ ],其差分陣列d[i]=a[i]-a[i-1] (i>0)且d[0]=a[0]

令sumd[i]=d[0]+d[1]+d[2]+…+d[i] (sumd[ ]是差分陣列d[ ]的字首和)

則sumd[i]=a[0]+a[1]-a[0]+a[2]-a[1]+a[3]-a[2]+…+a[i]-a[i-1]=a[i]

即a[i]的差分陣列是d[i], 而d[i]的字首和是a[i]

對於「數列遊戲」這題: 如果每次修改都修改從l到r的值的話,一定會tle。

注意特殊處:這道題是先進行整體區間修改,最後才統一查詢。 所以,我們只要維護乙個差分陣列就行了。

維護差分陣列,對於將區間[l,r]加c,我們只需要將d[l]+c和d[r+1]-c 當修改完畢後,我們先求一遍差分字首和就得到了修改後的陣列a[ ],

然後再對a[ ]求一遍字首和

這樣每次查詢的時候只要計算一次就可以得到結果了

實現的**就不提供

啦(做完題目很久才寫的部落格是在是罪過啊)

差分陣列概述

在網上講差分陣列的博文很少,也很難找到。一度以為差分陣列是傳播於小眾的神犇技巧所以一直放著沒有去研習。今天做了 bzoj1635後發現各路神犇都用差分陣列,本蒟卻傻傻寫了線段樹。對於序列a 取a i a i 1 為其差分陣列b i 的值,可以發現,a i bj 1 j i 如 對於序列 a b c ...

港口 差分陣列)

傳送門 思路 因為是區間加減,所以考慮差分陣列,題意變為 要求差分陣列d 2 d 3 d n d 2 d 3 dots d n d 2 d 3 d n 全為0.每次區間加或減會使差分陣列乙個加1,乙個減1,因為要用最小次數,所以每次操作最好產生有效貢獻,可知當為正數或負數的差分陣列變為0後,剩下我們...

差分陣列詳解

學習部落格 題目 來先看一道裸題,有n個數。m個操作,每一次操作,將x y區間的所有數增加z 最後有q個詢問,每一次詢問求出x y的區間和。思路 很明顯,直接用字首和無法快速滿足這個操作,所以我們就用到了差分陣列。設a陣列表示原始的陣列 設d i a i a i 1 1設f i f i 1 d i ...