關於樹狀陣列的兩種初始化方法
方法一:
初始化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 用於確定區間...