樹狀陣列初步

2022-08-17 14:33:15 字數 1399 閱讀 8640

fuction:

\(\begin\text \\ \text\\ \text\end\)

原理:定義c[i],表示以i為結尾的前lowbit(i)個數(原數列)的和(字尾和)

維護c[i],根據上圖,從底至上(二進位制增加拼湊)更新code:

inline void update(int pos,int val)
區間查詢:字首和的思想,query(l,r)=sum(r)-sum(l-1)

code:query(實質是根據上圖的自頂向底(二進位制拆分))

inline void query(int pos)//呼叫query(r)-query(l-1)
solution:維護差分陣列d[i],根據d陣列維護c[i],區間修改轉化成單點修改(在端點處修改),單點查詢轉化成區間求和(差分陣列的字首和)

code:

update(l,val);

update(r+1,-val);//[l,r]+val

query(pos)//單點查詢

\(\sum\limits_^pa_i=\sum\limits_^p\sum\limits_^i d[j]=\sum\limits_^p(p+i-1)d[i]=(p+1)\sum\limits_^pd[i]-\sum\limits_^p d[i]\times i\)

維護\(c[i]\)為\(d[i]\),\(ci[i]\)為\(d[i]\times i\)

code:

#include#include#includeusing namespace std;

const int maxx=101000;

long long a[maxx],d[maxx],c[maxx],ci[maxx],di[maxx];

int n,q;

inline long long lowbit(long long x)

inline void add(long long pos,long long val)

}inline void update(long long l,long long r,long long val)

inline long long query(long long pos)

return ans1*(pos+1)-ans2;

}int main()

for(long long i=1;i<=q;++i)

else printf("%lld\n",query(r)-query(l-1));

}return 0;

}

2015 7 14 樹狀陣列及其初步應用

樹狀陣列 binary indexed tree 是一種設計新穎的陣列結構,它能夠高效地獲取陣列中連續n個數的和。概括說,樹狀陣列通常用於解決以下問題 陣列中的元素可能不斷地被修改,怎樣才能快速地獲取連續幾個數的和?舉個簡單的例子 現在有乙個長度為n的陣列,陣列記憶體有資料,對於這些資料一般有兩類操...

2015 7 14 樹狀陣列及其初步應用

樹狀陣列 binary indexed tree 是一種設計新穎的陣列結構,它能夠高效地獲取陣列中連續n個數的和。概括說,樹狀陣列通常用於解決以下問題 陣列中的元素可能不斷地被修改,怎樣才能快速地獲取連續幾個數的和?舉個簡單的例子 現在有乙個長度為n的陣列,陣列記憶體有資料,對於這些資料一般有兩類操...

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...