樹狀陣列模板

2022-05-06 21:33:10 字數 2151 閱讀 7535

樹狀陣列 1 單點修改,區間查詢

這個沒啥好講的,修改加查詢即可,查詢時利用字首和相減即可。

**

#includeusing namespace std;

const int maxn=1000010;

int n,q,u,v,k,a[maxn];

long long c[maxn];

int lowbit(int x)

void add(int x,long long y)

long long ask(int x)

int main()

while(q--)

else

}return 0;

}

樹狀陣列 2 區間修改,單點查詢

這道題還是比較簡單的,樹狀陣列僅支援「單點修改」那麼我們便需要在做出一些轉化來解決這個問題,我們可以新建乙個陣列b,起初全為0,對於每一條修改語句 "1,l,r,x"我們可以轉換為

1.把b[l]加上d

2.把b[r+1]減去d

其思路就類似於差分,我們在統計字首和時就相當將l到r這個區間加上了d,那麼我們就用樹狀陣列來維護b陣列的字首和(單點修改即可達到目的),因為各次操作之間具有可累加性,所以在樹狀陣列上查詢b[1~x]就的處理到目前位置1指令在a[x]上操作的數值總和,再加上a[x]的值我們就得到了答案。

**

#includeusing namespace std;

const int maxn=1000010;

int n,q,u,v,k,a[maxn];

long long c[maxn];

int lowbit(int x)

void add(int x,long long y)

long long ask(int x)

int main()

while(q--)

else

}return 0;

}

樹狀陣列 3 區間修改,區間查詢

對於這道題其實和樹狀陣列 2是差不多的,在樹狀陣列2中我們用陣列陣列維護了乙個陣列b,對於每條指令「 1,l,r,x」把b[l]加上d,再把b[r+1]減去d,我們以及講了陣列的字首和 \(\sum_^x\) b[i] 就是經過這些指令後a[x]增加的值。那麼序列a的字首和 a[1~x]整體增加的值就是:

\(\sum_^x\)

\(\sum_^i\) b[j]

上式可以改寫為

\(\sum_^x\)

\(\sum_^i\) b[j] = \(\sum_^x\) (x-i+1) \(\times\) b[i]= \(\sum_^x\) b[i] - \(\sum_^x\) i \(\times\) b[i]

本題我們可以增加乙個樹狀陣列維護i \(\times\) b[i]的字首和 \(\sum_^x\) i \(\times\) b[i]

,上式就可以直接計算了。

**

#includeusing namespace std;

const int maxn=1000010;

int n,q,u,v,k,a[maxn];

long long c[3][maxn],sum[maxn];

int lowbit(int x)

void add(int num ,int x,long long y)

long long ask(int num ,int x)

int main()

while(q--)

else

}return 0;

}

樹狀陣列模板

假設有一列數 1 i n 支援如下兩種操作 1.將ai的值加d。2.輸出ai ai 1 aj 1 i j n 樹狀陣列是一種特殊的資料結構,這種資料結構的時空複雜度和線段樹相似,但是它的係數要小得多 hdu 1166 敵兵布陣 題目 a國在海岸線沿直線布置了n個工兵營地。由於採取了某種先進的監測手段...

樹狀陣列模板

已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數數加上x 2.求出某乙個數的和 這種水水的樹狀陣列,博主就不做介紹,直接上 希望大家可以多多捧場!include include include include include include include include include ...

樹狀陣列模板

樹狀陣列 binary indexed tree bit fenwick tree 是乙個查詢和修改複雜度都為log n 的資料結構。主要用於查詢任意兩位之間的所有元素之和,但是每次只能修改乙個元素的值 經過簡單修改可以在log n 的複雜度下進行範圍修改,但是這時只能查詢其中乙個元素的值。一,改點...