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