樹狀陣列 BIT

2021-06-26 23:18:45 字數 1202 閱讀 5548

【樹狀陣列模版】

注意:樹狀陣列x必須》0,因為lowbit(0) = 0,會死迴圈;

【單點更新區間查詢】在log(n)內修改單點,求出cnt[x] = a[1]~a[x

]之和

求區間[a,b]之和只要求出 sum(b)-sum(a-1)即可

#define rep(i,a,n) for(int i = a; i < n; i++)

#define repe(i,a,n) for(int i = a; i <= n; i++)

#define per(i,n,a) for(int i = n; i >= a; i--)

#define clc(a,b) memset(a,b,sizeof(a))

#define inf 0x3f3f3f3f

typedef long long ll;

#define maxn 100010

int cnt[maxn],mx, a[maxn];

inline int lowbit(int x)

int sum(int x)

return ans;

}void update(int x, int num)

}

【區間更新單點查詢】在log(n)內修改區間a[1]~a[x]覆蓋次數,求出單點被覆蓋的次數

要修改區間[a,b]的覆蓋次數+1,可以 update(b,1), update(a-1,-1);

#define rep(i,a,n) for(int i = a; i < n; i++)

#define repe(i,a,n) for(int i = a; i <= n; i++)

#define per(i,n,a) for(int i = n; i >= a; i--)

#define clc(a,b) memset(a,b,sizeof(a))

#define inf 0x3f3f3f3f

typedef long long ll;

#define maxn 100010

int cnt[maxn],mx, a[maxn];

inline int lowbit(int x)

int sum(int x)

return ans;

}void update(int x, int num)

}

樹狀陣列(BIT)

樹狀陣列 bit 是能夠完成下述操作的資料結構。在解題過程中,我們有時需要維護乙個陣列的字首和s i a 1 a 2 a i 但是不難發現,如果我們修改了任意乙個a i s i s i 1 s n 都會發生變化。可以說,每次修改a i 後,調整字首和s在最壞情況下會需要o n 的時間。當n非常大時,...

wenbao與樹狀陣列(BIT)

經典入門題,敵兵布陣 1 include 2 include 3 include 4using namespace std 56 int n,aa 50005 cc 50005 7 8int lowbit int x 11 12void add int x,int y 17 18 19int sum...

BIT二叉索引樹(樹狀陣列)

powered by phantom lsh將上面的求連續和問題稍微改進一下,現在需要支援一種新的操作 add x d 即把a x 增加d。這樣一來,如果通過字首和的方式計算就不能簡化計算了,因為每次修改乙個元素都要修改所有在它後面的字首和。有什麼解決辦法呢?我們需要用一種新的資料結構 bit二叉索...