樹狀陣列與並查集類似,是一種資料結構,它可以用來維護字首和問題
不過,利用字首和和查分的思想,我們也可以用樹狀陣列解決區間問題
與線段樹不同,目前我暫且認為線段樹解決最值問題,而樹狀陣列解決求和問題
樹狀陣列原理建立在二叉樹上:利用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 二 樹狀陣列的表...