模板 樹狀陣列的區間加值和區間查詢

2021-08-13 08:46:50 字數 1135 閱讀 7171

樹狀陣列可以實現單點修改區間查詢,或是差分的區間修改單點查詢。【點這裡】

那麼樹狀陣列能不能實現區間加值區間查詢呢?

原始序列為a。我們先考慮區間加值,用差分的方式維護乙個d陣列,d[x]表示的是[x,maxn]每個數的增量。

那麼如果需要查詢1~x的字首和,需要查的是 su

mx=s

igma

(ai)

+d1∗

x+d2

∗(x−

1)+d

3∗(x

−2)+

...+

dx∗1

=sigma(

ai)+

sigm

a(di

∗(x+

1−i)

) =s

igma

(ai)

+(x+

1)∗s

igma

(di)

−sig

ma(d

i∗i)

所以把di

處理乙個樹狀陣列tree,di

∗i處理成乙個樹狀陣列treex。查詢sum[x]時只需要求suma[x]+(x+1)*tree[x]-treex[x]就可以了。

模板題是【模板】線段樹1 洛谷p3372

#include

#define lowbit(x) (x&(-x))

using

namespace

std;

int n,m;

long

long a[100005];

long

long tree[100005],treex[100005];

inline

void add(long

long *ths,int x,long

long num)

}inline

long

long search(long

long *ths,int x)

return re;

}inline

long

long search(int x)

int main()

else

}return

0;}

區間樹狀陣列

具體引數見注釋.首先是設定 於是我們有了 可以足夠快進行區間更新 的樹狀陣列。1 2 常量maxn用於設定樹狀陣列的尺寸大小3 4const long long maxn 500233 5 class treelikearray629 30 31 特別樹狀陣列單點更新操作,要求傳入位置和引數 32 ...

樹狀陣列(單點 區間)操作模板

相關講解鏈結 一維 include include include using namespace std long long n,q,c 1000005 a 1000005 long long lowbit long long x void add long long x,long long d ...

樹狀陣列 模板1 單點修改和區間和

劃重點 先放一篇大佬的部落格,我就直接劃重點了 0 樹狀陣列時間修改值和區間和複雜度log n 用於維護區間和計算區間和。1 a表示原陣列,c表示樹狀陣列,更新值和更新sum都根據二進位制下標,陣列下標最後從1開始 c i a i 2 k 1 a i 其中k為i用二進位制表示時的末尾0的個數。根據規...