求逆序數 樹狀陣列

2021-09-02 07:26:43 字數 3013 閱讀 2316

我們假設乙個陣列a [n]的,當乙個a[n] = 0的時候表示數字n沒有在集合中出現過,當乙個a[n] = 1時則出現過.a對應的樹狀陣列為c [n]。

(被csdn**亂碼氣死

這個運算得到的值為k,k就是從我的末尾開始0的個數

對照式子可以發現c [1] = a [i-2 ^ k + 1] + a [i-2 ^ k + 2] + ...... a [1]; (k為我的二進位制中從最低位到高位連續零的長度)例如i = 8時,k = 3;

下面利用c [i]陣列,求甲陣列中前我項的和 

舉個例子i = 7;

sum [7] = a [1] + a [2] + a [3] + a [4] + a [5] + a [6] + a [7]; 前我項和

c [4] = a [1] + a [2] + a [3] + a [4]; c [6] = a [5] + a [6]; c [7] = a [7];

可以推出:sum [7] = c [4] + c [6] + c [7];

序號寫為二進位制:sum [(111)] = c [(100)] + c [(110)] + c [(111)];

再舉個例子i = 5

sum [5] = a [1] + a [2] + a [3] + a [4] + a [5]; 前我項和

c [4] = a [1] + a [2] + a [3] + a [4]; c [5] = a [5];

可以推出:sum [5] = c [4] + c [5];

序號寫為二進位制:sum [(101)] = c [(100)] + c [(101)];

結合**

int getsum(int x)

對於i = 7進行演示 

7(111)ans + = c [7]

lowbit(7)= 001 7-lowbit(7)= 6(110)ans + = c [6]

lowbit(6)= 010 6-lowbit(6)= 4(100)ans + = c [4]

lowbit(4)= 100 4-lowbit(4)= 0(000)    

對於i = 5進行演示 

5(101)ans + = c [5]

lowbit(5)= 001 5-lowbit(5)= 4(100)ans + = c [4]

lowbit(4)= 100 4-lowbit(4)= 0(000)   

當我們修改a 陣列中的某乙個值時應當如何更新c 陣列呢?

回想一下區間查詢的過程,再看一下上文中列出的圖

結合**分析

void add(int x,int y)

//可以發現 更新過程是查詢過程的逆過程

//由葉子結點向上更新c陣列

當更新a [1]時需要向上更新c [1],c [2],c [4],c [8]

c [1],c [2],c [4],c [8]

寫為二進位制c [(001)],c [(010)],c [(100)],c [(1000)]

1(001)c [1] + = a [1]

lowbit(1)= 001 1 + lowbit(1)= 2(010)c [2] + = a [1]

lowbit(2)= 010 2 + lowbit(2)= 4(100)c [4]+ = a [1]

lowbit(4)= 100 4 + lowbit(4)= 8(1000)c [8]+ = a [1]

#include #include using namespace std;

#define n 1010

int c[n];

int n;

int lowbit(int i)

int insert(int i,int x)

return 0;

}int getsum(int i)

return sum;

}void output()

cout<參考:

樹狀陣列求逆序數

逆序數就是數中各位在它前面有多少個數比它大,求出這些元素個數之和。今天看了個樹狀陣列,可以很好的解決這個問題,普通方法需要o n 2 複雜度,用樹狀陣列只需要o nlongn 樹狀陣列實際上還是乙個陣列,只不過它的每個元素儲存了跟原來陣列的一些元素相關的結合值。若a為原陣列,定義陣列c為樹狀陣列。c...

樹狀陣列求逆序數

chikachika說希望和我一起做學園偶像的時候,我真的很開心。watanabeyouwatanabeyou 曜是千歌的青梅竹馬,但是aqoursaqours成立以後,千歌似乎總是與梨子在一起,而把曜冷落了。為了讓千歌知曉自己的心意,曜醬決定做一件大事!她決定把乙個給定的11 nn的排列 1 ai...

樹狀陣列 求逆序數

一.樹狀陣列介紹 1 性質 樹狀陣列本質上就是乙個陣列,它與普通陣列不同之處在於它的某些元素維護的是一段區間的資訊,已區間和為例,若i為奇數,則第i個元素就是源資料的第i個元素,若i為偶數,則第i個元素維護的是 i 2 k 1,i 這段區間的和,k代表i的二進位制末尾0的個數。2 作用 樹狀陣列常用...