樹狀陣列維護區間和和區間修改

2021-08-15 12:31:52 字數 900 閱讀 3328

可以用樹狀陣列在(n*logn)內,雖然線段樹也能,但是樹狀陣列的**,空間都要比它優越得多.

首先我們可以用差分的方法使區間修改可以在log的複雜度完成,但重點在於區間和的查詢.

我們知道,此時num[i]=a[1]+a[2]+……a[i],可以利用樹狀陣列快速求出.

而區間和則是(a[1]+a[2]+……a[i])+(a[1]+a[2]+……a[i-1])……..+(a[1]+a[2])+a[1].

也就是i*(a[1]+a[2]+……a[i])-(a[1] * 0+a[2] * 1……a[i] *(i-1)).

前半部分可以用樹狀陣列維護,後面可以再建乙個樹狀陣列維護(i-1)*a[i]的字首和.

就可以用兩個樹狀陣列維護區間和和區間修改

以洛谷 p3372 【模板】線段樹 1為例.

#include

#include

#define lb(x) (x&(-x))

#define ll long long

#define n 100100

using

namespace

std;

ll n,m,s1[n],s2[n],num[n];

inline

void add(ll u,ll v,ll w)

}inline ll ask(ll u)

res*=u;

for(i=u;i;i-=lb(i))

return res;

}int main()

for(i=1;i<=n;i++)

for(i=1;i<=m;i++)

else

}}

樹狀陣列區間修改

有時,我們要支援區間修改,區間查詢。線段樹可以做到。但是樹狀陣列更好寫。1d的情況 設 b i a i a i 1 則 a i b 1 b i a 1 a l b 1 b 1 b 2 b 1 b l a 1 a l l b 1 l 1 b 2 b l sum l i 1 b i 如果我們維護 b i...

樹狀陣列 區間修改,區間查詢

也許更好的閱讀體驗 好東西,以後可以不打線段樹了 本篇假定讀者都會最基礎的兩種樹狀陣列,即區改單查和單改區查 思考如何維護乙個區間的值,想到了差分 對乙個差分陣列做一次字首和可以得到每個位置的值 再對每個位置累加一下就是乙個區間的值 公式化的講,就是 設差分陣列為 c 則每個位置的值 val i s...

樹狀陣列區間修改區間查詢

題面 首先,我們要推乙個柿子。displaystyle sum a i 把a i 用差分陣列表示出來,就可以寫成 displaystyle sum sum d i 我們考慮一下,每個d i 出現的次數是一定的。那我們可以換一下列舉順序,先列舉d i 在列舉他出現的次數,就可以變成 displayst...