可以用樹狀陣列在(n*logn)內,雖然線段樹也能,但是樹狀陣列的**,空間都要比它優越得多.
首先我們可以用差分的方法使區間修改可以在log的複雜度完成,但重點在於區間和的查詢.以洛谷 p3372 【模板】線段樹 1為例.我們知道,此時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]的字首和.
就可以用兩個樹狀陣列維護區間和和區間修改
#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...