樹狀陣列可以實現單點修改區間查詢,或是差分的區間修改單點查詢。【點這裡】
那麼樹狀陣列能不能實現區間加值區間查詢呢?
原始序列為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的個數。根據規...