樹狀陣列求排列的逆序數

2021-08-21 19:08:19 字數 1257 閱讀 9644

由於樹狀陣列沒有負數節點和0節點,(有些書上說有0節點,是為了方便理解樹狀陣列而假設存在的虛擬節點,),所以當排列中有負數或0的話,先將他們按照輸入順序標號,再將其從小到大排序,然後以標號為排列查詢逆序數。

原理假設數列為 5 4 3 2 1

5前面比它本身小的數有0個

4前面比它本身小的數有1個

3前面比它本身小的數有2個

2前面比它本身小的數有3個

1前面比它本身小的數有4個

所以他的逆序數為1+2+3+4=10

如果只是單純的暴利的話,這是一種o(n2)的做法,但是我們有一種更為方便的資料結構—-樹狀陣列,它查詢和,修改單點值的複雜度為o(logn),所以複雜度就降到了o(nlogn)。

下面提供兩個**。

排列不包含0和負數

#include 

#include

#include

#include

using

namespace

std;

int c[100005], n;

int lowbit(int i)

void update(int k, int x)

}int getsum(int k)

return sum;

}int main()

printf("%lld\n", ans);

}}

排列為任意數字

#include 

#include

#include

#include

using

namespace

std;

typedef

struct node

node;

node arr[100005];

int c[100005], n;

int cmp(node a, node b)

int lowbit(int i)

void update(int k, int x)

}long

long

int getsum(int k)

return sum;

}int main()

sort(arr + 1, arr + n + 1, cmp);

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

printf("%lld\n", ans);

}}

樹狀陣列求逆序數

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