樹狀陣列的個人總結

2021-07-29 05:42:05 字數 1338 閱讀 4816

模板組成

模板構成

lowbit (x)//返回

x的最低位1

eg:2^0 2^1 2^2

updata(int x,int val)//更新資料

while(x<=n)//更新的時候我們要更新包含

a[x]

的所有c[x];

//查詢父節點的時候我們就需要

lowbit()

c[x]+=val;

x+=lowbit(x);

如果我們在a[6]陣列加

val

我們需要更新c[6]

lowbit(6)

=2 繼續更新c[6+lowbit[6]]+=val;

6+lowbit[6]=8;

lowbit[8]=8;

繼續更新c[8+8]+=val;

getsum(

int n)//

求和運算

int sum=0;

while(n>0)

{sum+=c[n];

n-=lowbit[n];

這裡的求和資料和上乙個更新資料相反

這裡是不斷

往下尋找

sum[9]=c[9]+c[9-lowbit[9]](

c[8]

)+(c[0]   

因為0

不滿足條件就跳出)

因為lowbit(9)=2^0-=1

lowbit(8)=2^3-=8

主要的思路是這個實際的應用需要通過練習

for example

求逆序數

輸入n然後輸入n個資料

input

1  3  2  5  4

output

分析每個資料具有兩個屬性num(數值

)pos

(位置)

struct data

int num,pos;

輸入for(int i=1;i<=n;i++)

{scanf(「%d」.&a[i].num);

a[i].pos=i;

sort(a,a+n,cmp)//將資料進行排序

num從小到大

//注意數值相同時按照

pos排序

離散一下空間

定義hash【

10003】;

for(int i=1;i<=n;i++)

hash[a[i].pos]=i;

int sum=0;

for(int i=1;i<=n;i++)

updata(hash[i],1);

sum+=hash[i];

print(「%d\n」,sum);

樹狀DP個人總結

樹狀dp就是在樹上的動態規劃,樹狀dp的特殊性 無環,dfs不會重複,具有明顯嚴格的層數關係。大神的好文 大神的好文 什麼時候用樹狀dp?什麼題目滿足動態規劃的要求?子問題最優解也是全域性最優解,滿足無後效性,多階段決策問題。把問題首先分解為若干個子問題,在每乙個子問題做 出決 策,動態規劃就是解決...

樹狀陣列總結

樹狀陣列的基本知識已經被各種大牛和菜鳥講到爛了,我就不多說了,下面給出基本操作的 假定原陣列為a 1.n 樹狀陣列b 1.n 考慮靈活性的需要,使用int a傳陣列。define lowbit x x x int sum int a,int x void update int a,int x,int...

樹狀陣列總結

樹狀陣列是對乙個陣列改變某個元素和求和比較實用的資料結構。兩中操作都是o logn 在解題過程中,我們有時需要維護乙個陣列的字首和s i a 1 a 2 a i 但是不難發現,如果我們修改了任意乙個a i s i s i 1 s n 都會發生變化。可以說,每次修改a i 後,調整字首和s在最壞情況下...