樹狀陣列模板加理解

2021-10-10 01:21:00 字數 1381 閱讀 6658

樹狀陣列2的關鍵是lowbit()函式,lowbit(x)=x&-x,功能是找到x的二進位制的最後一「1」(不得不感嘆這個精妙之處),其原理是利用負數的補碼,補碼是原始碼取反加一,例如x=6=000110(2),-x=x補=111010(2),那麼lowbit(x)=2;

大致上樹狀陣列是運用三個函式來實現lowbit(),add(),sum(),

lowbit(x)引出乙個tree[ ]陣列,所有的計算都是圍繞tree[ ]進行,

#define lowbit(x) ((x)& -(x))

void

add(

int x,

int d)

}int

sum(

int x)

return sum;

}

已poj 2182為例

(1)在n個位置上,每個位置上都有一頭牛,及a1=a2=…=an=1,不過並不需要直接定義和使用陣列a[ ]

(2)tree[ ]陣列的初始化,這個題目比較特殊,不需要add初始化,因為lowbit()就是tree[i];

(3)程式所要做的,就是對每乙個x[i]+1,用find_cow()找出對應的x,就是第x頭牛之後,ax=0,方法就是add()更新陣列tree[ ],及執行add(x,-1),

下面的程式完全套模板

#include

#include

#include

#include

#include

#define ll long long

#include

#include

#include

#define inf 0x3f3f3f3f

#define lowbit(x) ((x)& -(x))

using

namespace std;

int n,tree[

100005

],x[

100005];

int ans[

100005];

void

add(

int x,

int d)

}int

sum(

int x)

return sum;

}int

find_cow

(int x)

return l;

}int

main()

for(

int i=

1;i<=n;i++

)for

(int i=n;i>

0;i--

)for

(int i=

1;i<=n;i++

)}

樹狀陣列模板

假設有一列數 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 的複雜度下進行範圍修改,但是這時只能查詢其中乙個元素的值。一,改點...