樹狀陣列求逆序數

2021-09-10 13:08:21 字數 1431 閱讀 8364

部分**:  

逆序對就是如果i > j && a[i] < a[j],這兩個就算一對逆序對,簡單來說,所有逆序對的個數和就是找每乙個數的前面有幾個比他的大的數,他們加起來的和就是逆序對的總數。

知道什麼是逆序對後就好辦了,樹狀陣列的功能就是可以單點更新,區間查詢,這樣你把每個數該在的位置離散化出來,然後每次把每個數該在的位置上加上1,比如乙個數該在的位置為x,那麼用add(x)把這個位置加上1,然後再用區間查詢read(x)查詢1~x的和,也就是可以知道前面有多少個數是比他小的了(包括那個數自己),再用已經插入的數的個數減去read(x),就算出了前面有多少個數比他大了。

下面舉個例子來詳細的看一下過程:

第一次插入的時候把5這個位置上加上1,read(x)值就是1,當前已經插入了乙個數,所以他前面比他大的數的個數就等於 i - read(x) = 1 - 1 = 0,所以總數 sum += 0

第二次插入的時候,read(x)的值同樣是1,但是 i - read(x) = 2 - 1 = 1,所以sum += 1

第三次的時候,read(x)的值是2,i - read(x) = 3 - 2 = 1,所以sum += 1

第四次,read(x)的值是1,i - read(x) = 4 - 1 = 3,所以sum += 3

第五次,read(x)的值是1,i - read(x) = 5 - 1 = 4,所以sum += 4

這樣整個過程就結束了,所有的逆序對就求出來了。

**:

#include#include#include#includeusing namespace std;

#define maxn 10005

typedef long long ll;

int c[maxn];

int lowbit(int x)

void update(int x,int val,int n)

int getsum(int x)

struct nodea[maxn];

int cmp(node a,node b)

{ return a.val

樹狀陣列求逆序數

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