樹狀陣列區間更新 單點查詢

2021-09-19 12:42:17 字數 811 閱讀 5540

設a陣列表示原來的區間

c[i]:=a[i]-a[i-1],這樣可以看出:a[i]=sum(c[1],c[2]…c[i])

例如:a:1 3 4 2 6 8

c:1 2 1 -2 4 2

樹狀陣列維護的是c陣列

當把a[3,5]每個數都加2時,我們看c陣列,由於c陣列維護的是相鄰區間的差值,所以c[3]+=2

因為區間[3,5]都加了2,所以在c[4],c[5]的值不變,c[6]的值-=2

然後求a[i]就是sum(c[1],c[2]…c[i])

模板題:hdu1556

**如下:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

typedef pairp;

const int inf=0x3f3f3f3f;

const int n=100000;

int n,c[n+10];

int lowbit(int x)

void add(int x,int m)

}ll sum(int x)

return res;

}int main()

for(int i=1;i<=n;i++)

}}

樹狀陣列區間更新 區間查詢 單點查詢

為了更好地使用複雜度比線段樹更加優化的樹狀陣列,所以必須實現樹狀陣列的區間更新 樹狀陣列時間複雜度為o mlogn 實際用的時候優於線段樹,且寫得少。引入差分陣列,假設初始資料陣列為a,另a 0 0 設要維護的差分陣列為 d i a i a i 1 進一步可知 a i d 1 d 2 d i 即前i...

樹狀陣列 單點更新 區間查詢

input 每組測試用例首先一行是2個正整數n和m n 100000,m 10000 其中,n表示士兵的數量,m表示有m個詢問。接下來一行是n個正整數,依次表示n位士兵cf的rating。其中,rating的取值範圍是小於等於5000。最後是m行的詢問,每行包含2個正整數a和b,表示要計算從第a個士...

樹狀陣列的單點更新,區間查詢。

基本的陣列陣列概念,樹狀陣列利用其特殊的位置可以用二進位制達到log級別的更新,如下圖 核心 int sum int i return s void add int i,int x lowbit的作用是求出最低位的那個1,為什麼這樣可以求出來呢,是因為計算機中是採用補碼的方式來儲存數值型資料,所以負...