1. 程式人生 > >樹狀數組求逆序數

樹狀數組求逆序數

是否 之間 如果 大小 現在 .cn [1] 自然數 pan

1逆序數一波:

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

比如: 2431這個排列,

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

2.樹狀數組:

  https://www.cnblogs.com/zllwxm123/p/9342044.html

  參考上面那篇博客.

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

  

樹狀數組求逆序數