演算法 樹狀陣列

2022-05-20 07:28:16 字數 1131 閱讀 5031

相信大家都會樹狀陣列的"單點修改,區間查詢"或者"區間修改,單點查詢",博主就不細講了。

但是博主今天發現了乙個神奇的演算法(博主太菜),它可以使用樹狀陣列維護"區間修改,區間查詢"。

就是乙個優化過的字首和,使查詢和修改協調為\(\theta(log_2n)\)

**

namespace fentree

void add(int i, int val)

#undef maxn

#undef lowbit

};

將上面的樹狀陣列進行差分,就珂以了

演算法詳解

設原陣列\(a\)從下標一開始,長度為\(n\),\(a_i-a_\)記為\(\delta_i\),我們規定\(a_0=0\)

那麼\[a_i=\sum_^i_i

\]上式求和時兩兩抵消,易證。

所以,若\(x\in[1,n]\)

\[\sum_^xa_i=\sum_^x\sum_^i_j=\sum_^x(x-i+1)\times_i

\]於是

\[\sum_^xa_i=(x+1)\sum_^x_i-\sum_^x_i \times i

\]最後我們愉快的差分維護兩個樹狀陣列,

乙個維護\(d_i\),另乙個維護\(d_i \times i\)

**

namespace fenwick

inline void modify(int x, int y, ll val)

ll queryprefix(int x)

inline ll query(int x, int y)

};

練習

[loj132]樹狀陣列 3 :區間修改,區間查詢

#include namespace fenwick

inline void modify(int x, int y, ll val)

ll queryprefix(int x)

inline ll query(int x, int y)

};using namespace fenwick;

ll read()

int main()

}return 0;

}

演算法 樹狀陣列

演算法適用於求前k個整數的和,一般的做法是設定乙個sum陣列來表示 1 問題公升級一下 在查詢的過程中隨時給第x個整數加上乙個整數v,同樣要求查詢第k個整數的和。此時若還是原來的sum陣列,則要遍歷來更新,複雜度為o n 而用樹狀陣列則時間要更快。2 再來一題 很簡單的,別怕昂 計算序列中在元素左邊...

演算法 樹狀陣列

要學樹狀陣列的先看懂一幅圖 這就是樹狀陣列的儲存方式。那麼樹狀陣列的優點是什麼呢,允許任意修改,可快速提取出a陣列內數字 據圖可知 c1 a1,c2 a1 a2,c3 a3,c4 a1 a2 a3 a4,c5 a5,c6 a5 a6,c7 a7,c8 a1 a2 a3 a4 a5 a6 a7 a8,...

演算法(十三)樹狀陣列

問題描述 小蔥喜歡除法,所以他給了你n個數a1,a2,an,並且希望你執行m次操作,每次操作可能有以下兩種 給你三個數l,r,v,你需要將al,al 1,ar之間所有v的倍數除以v。給你兩個數l,r,你需要回答al al 1 ar的值是多少。輸入格式 第一行兩個整數n,m,代表數的個數和操作的次數。...