樹狀陣列小總結

2021-08-19 03:18:36 字數 2875 閱讀 7009

關於樹狀陣列的兩種初始化方法

方法一:

初始化bit

bitbi

t陣列為0

00,然後對於陣列a

aa的每乙個元素進行add

addad

d操作,時間複雜度o(n

logn

)o(nlogn)

o(nlog

n)方法二:

預處理a

aa陣列的字首和pre

prepr

e陣列,bit

[ind

ex]=

pre[

i]−p

re[i

ndex

−low

bit(

inde

x)]。

bit[index] = pre[i]-pre[index-lowbit(index)]。

bit[in

dex]

=pre

[i]−

pre[

inde

x−lo

wbit

(ind

ex)]

。時間複雜度o(n

)o(n)

o(n)

參考大佬的部落格

//單點更新,區間查詢

//區間更新,單點求值

//區間更新,區間求值

#include

#include

#include

using namespace std;

typedef

long

long ll;

const

int maxn =

1e6+5;

ll delta[maxn]

, deltai[maxn]

;ll sum[maxn]

;//sum是字首和陣列

int n, q;

int op, l, r;

intlowbit

(int x)

void

add(ll *a,

int pos, ll x)

}ll query

(ll *a,

int pos)

return ans;

}int

main()

while

(q--

)else}}

return0;

}

二維樹狀陣列

//單點修改,區間查詢

void

add(

int x,

int y,

int z)

}void

ask(

int x,

int y)

//區間修改,單點查詢

void

add(

int x,

int y,

int z)

}void

range_add

(int xa,

int ya,

int xb,

int yb,

int z)

void

ask(

int x,

int y)

}

//區間修改,區間查詢

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

ll read()

const

int n =

205;

ll n, m, q;

ll t1[n]

[n], t2[n]

[n], t3[n]

[n], t4[n]

[n];

void

add(ll x, ll y, ll z)

}void

range_add

(ll xa, ll ya, ll xb, ll yb, ll z)

ll ask

(ll x, ll y)

ll range_ask

(ll xa, ll ya, ll xb, ll yb)

intmain()

}while

(q--

)for

(int i =

1; i <= n; i++

)return0;

}

樹狀陣列總結

樹狀陣列的基本知識已經被各種大牛和菜鳥講到爛了,我就不多說了,下面給出基本操作的 假定原陣列為a 1.n 樹狀陣列b 1.n 考慮靈活性的需要,使用int a傳陣列。define lowbit x x x int sum int a,int x void update int a,int x,int...

樹狀陣列總結

樹狀陣列是對乙個陣列改變某個元素和求和比較實用的資料結構。兩中操作都是o logn 在解題過程中,我們有時需要維護乙個陣列的字首和s i a 1 a 2 a i 但是不難發現,如果我們修改了任意乙個a i s i s i 1 s n 都會發生變化。可以說,每次修改a i 後,調整字首和s在最壞情況下...

樹狀陣列總結

今天學習了一下樹狀陣列,做乙個簡單總結。樹狀陣列可分為兩種操作,1 修改單個點,統計區間和 一般為 向上修改 update1 向下統計 sum1 2 修改區間,統計單個點 一般為向下修改 update2 向上統計 sum2 主要模板如下 int c n int lowbit int x 用於確定區間...