樹狀陣列學習

2022-09-19 10:45:14 字數 1480 閱讀 5967

樹狀陣列與並查集類似,是一種資料結構,它可以用來維護字首和問題

不過,利用字首和和查分的思想,我們也可以用樹狀陣列解決區間問題

與線段樹不同,目前我暫且認為線段樹解決最值問題,而樹狀陣列解決求和問題

樹狀陣列原理建立在二叉樹上:利用lowbit運算實現向根節點儲存的原理

介紹lowbit的程式實現只有三行就不打了

int lowbit(int x)

下面是利用lowbit運算原理實現的add函式,很基礎很簡單

void add(int x,int y)

}

有了區間加還不夠,我們還要實現查詢,下面依舊是依靠lowbit運算原理實現的ques查詢函式

int ques(int x)

return ans;

}

沒錯,這是樹狀陣列的基礎操作

下面是一維樹狀陣列中常見的型別及模板

1.單點修改,區間查詢

分析:這是基礎的一類題,正好用上述三個操作來實現

code

#include using namespace std;

const int p=1e5+10;

char cmd[4];

int a[p],t[p];

int n,m,k,d;

int lb(int x)

void add(int x,int y)

}int sum(int x)

return ans;

}int main()

scanf("%d",&m);

while(m--)

else

void ques(int x)

cout<

結束,你會了

不我不會

3.區間修改,區間查詢(漏)

結合了上述兩個的性質,開兩個樹狀陣列

乙個用來維護區間修改,乙個用來維護區間查詢

code

#include using namespace std;

#define ll long long

const int n=1e5+10;

int n,belong[n],size;

ll a[n],sum[n],tag[n];

inline ll read()

void add(int l,int r,ll v){

for(int i=l;i<=min(r,belong[l]*size);++i)

a[i]+=v,sum[belong[i]]+=v;

if(belong[l]!=belong[r])

for(int i=(belong[r]-1)*size+1;i<=r;++i)

a[i]+=v,sum[belong[i]]+=v;

for(int i=belong[l]+1;i

咕了好久

~~太頹了~~

樹狀陣列學習

之前寫的題也遇到過用樹狀陣列,當時都是現查現學,而且總是搞不懂,今天又遇到了一道求區間和的題,不管最後是不是用樹狀陣列可以a,但是既然已經想到了這,就打算好好學習一下。可惜之前查到的資料都沒有儲存記錄,所以又重新查了些資料,彙總學習如下 文末附上樹狀陣列的詳細 樹狀陣列主要用到的操作 int low...

樹狀陣列學習

我覺得,樹狀陣列挺重要的就是那個 lower x x x 我說說我的理解吧。每乙個正整數都可以拆分成 2 的某些冪之和,例如 15 8 4 2 1 6 4 2 7 4 2 1 感覺可以解釋lca的倍增跳 那麼轉換成二進位制是什麼樣的呢?15 十進位制 1111 1000 100 10 1 6 十進位...

樹狀陣列學習小結

樹狀陣列,又稱二進位制索引樹,英文名binary indexed tree。一 樹狀陣列的用途 主要用來求解數列的字首和,a 0 a 1 a n 由此引申出三模擬較常見問題 1 單點更新,區間求值。hdu1166 2 區間更新,單點求值。hdu1556 3 求逆序對。hdu2838 二 樹狀陣列的表...