樹狀陣列(單點 區間)操作模板

2022-02-04 07:33:08 字數 2060 閱讀 7768

相關講解鏈結

**(一維)

#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)

long long ask(long long x)

int main()

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

return 0;

}

**(二維)
#include #include #define maxn 4100

using namespace std;

int c[maxn][maxn],n,m;

int lowbit(int x)

void add(int x,int y,int d)

long long ask(int x,int y)

int main()

return 0;

}

**(一維)+(不用差分的 偷懶正解)
#include #include #include using namespace std;

long long n,q,a[1000005],c[1000005];

long long lowbit(long long x)

void add(long long x,long long d)

long long ask(long long x)

int main()

else

}return 0;

}

設原陣列為a[i], 設陣列d[i]=a[i]−ai−1,則a[i]=∑ij=1d[j],可以通過求d[i]的字首和查詢。

當給區間[l,r]加上x的時候,a[l] 與前乙個元素 a[l−1] 的差增加了x,a[r+1] 與 a[r] 的差減少了x。根據d[i]陣列的定義,只需給d[l] 加上 x, 給d[r+1] 減去 x 即可。

void add(int p, int x)

void range_add(int l, int r, int x)

int ask(int p)

**(一維)
#include #include #include using namespace std;

long long n,q,a[100005],sum1[100005],sum2[100005];

long long lowbit(long long x)

void add(long long x,long long d)

}long long ask(int x)

int main()

while(q--)

else if(f=='c')

}return 0;

}

**(二維)

維護:d[i][j],d[i][j]∗i,d[i][j]∗j,d[i][j]∗i∗j (d[i][j]為a[i][j]差分陣列)

#include #include #define int long long

#define maxn 2050

using namespace std;

int n,m,sum1[maxn][maxn],sum2[maxn][maxn],sum3[maxn][maxn],sum4[maxn][maxn];

int lowbit(int x)

void add(int x,int y,int d)

}int ask(int x,int y)

void addedge(int xa,int ya,int xb,int yb,int d)

int askedge(int xa,int ya,int xb,int yb)

signed main()

return 0;

}

樹狀陣列 模板1 單點修改和區間和

劃重點 先放一篇大佬的部落格,我就直接劃重點了 0 樹狀陣列時間修改值和區間和複雜度log n 用於維護區間和計算區間和。1 a表示原陣列,c表示樹狀陣列,更新值和更新sum都根據二進位制下標,陣列下標最後從1開始 c i a i 2 k 1 a i 其中k為i用二進位制表示時的末尾0的個數。根據規...

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

說一下差分 現在我們有乙個從小到大的數列a a 1 3 6 8 9 然後還有乙個差分陣列b b 1 2 3 2 1 對應 1,3 1,6 3,8 6,9 8,相信某些同學絕已經看出端倪了.這裡b i a i a i 1 我令a 0 0,故b 1 a 1 int now 0,temp scanf d ...

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

普通的單點修改單點查詢就不講了,從區間修改和單點查詢講起。原來的值存在a裡面,多建立個陣列c1,注意 c1 i a i a i 1 那麼求a i 的值的時候a i a i 1 c1 i a i 2 c1 i c1 i 1 c1 1 c1 2 c1 i 所以就用c1建立樹狀陣列,便可以很快查詢a i ...