樹狀陣列求逆序數

2022-02-18 03:53:35 字數 1101 閱讀 1382

1逆序數一波:

在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。乙個排列中所有逆序總數叫做這個排列的逆序數。也就是說,對於n個不同的元素,先規定各元素之間有乙個標準次序(例如n個 不同的自然數,可規定從小到大為標準次序),於是在這n個元素的任一排列中,當某兩個元素的先後次序與標準次序不同時,就說有1個逆序。乙個排列中所有逆序總數叫做這個排列的逆序數。

比如: 2431這個排列,

其中21,31,41,43,這四個就是逆序對,所以這個逆序數的總數就是4.

2.樹狀陣列:

參考上面那篇部落格.

3.用樹狀陣列求逆序數.

設a[x]為樹狀陣列,現在我們要存的是,x這個數是否出現過,出現過則,a[x]++;

那麼當我們求和的時候就是計算出當前位置之前有多少個數小於本身,那麼再根據我本身的位數,

就可以推出比我本身大的數在我前面有多少位.

(當然,如果數字很大的話,就需要先進行離散化.)

例如:計算下面一串數字的逆序數總數,

3425671

a 陣列表示的是i是否出現過,而ans表示的是在此之前有幾個數比自身小,cnt陣列就表示每個數可能與其後面的數構成逆序數的種數,其和就是總和.

a[3] 1   ans[1]  0    cnt[1] = 3 - ans[1] - 1 = 2

a[4] 1           ans[2]  1    cnt[2] = 4 - ans[2] - 1 = 2

a[2] 1   ans[3]  0    cnt[3] =  2 - ans[3] - 1 = 1

a[5] 1   ans[4]  3    cnt[4] =  5 - ans[4] - 1 = 1

a[6] 1   ans[5]  4    cnt[5] =  6 - ans[5] - 1 = 1

a[7] 1   ans[6]  5    cnt[6] =  7 - ans[6] - 1 = 1

a[1 ] 1   ans[7]  0    cnt[7] =  1 - ans[7] - 1 = 0

樹狀陣列求逆序數

逆序數就是數中各位在它前面有多少個數比它大,求出這些元素個數之和。今天看了個樹狀陣列,可以很好的解決這個問題,普通方法需要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 作用 樹狀陣列常用...