樹狀陣列求逆序對

2021-09-23 23:52:08 字數 1427 閱讀 3089

我們可以先開乙個大小為a的最大值的陣列t,每當讀入乙個數時,我們可以用桶排序的思想,將t[a[i]]加上1,然後我們統計t[1]~t[a[i]]的和ans,ans - 1(除掉這個數本身)就是在這個數前面有多少個數比它小。我們只要用i-ans就可以得出前面有多少數比它大,也就是逆序對的數量。

#include

#include

#include

#define lowbit(x) (x)&(-x)

using namespace std;

const

int maxn =

1e6+10;

int t[maxn]

,n,result;

void

add(

int x)

}int

query

(int x)

intmain()

printf

("%d\n"

,result)

;return0;

}

如果給定的一組數沒有連續,那麼就會存在空間浪費,,,需要進行離散化

每次存他們的下標

#include

#include

#include

#include

#include

using namespace std;

const

int maxn=

500005

;int aa[maxn]

;//離散化後的陣列

int c[maxn]

;//樹狀陣列

int n;

struct node

a[maxn]

;bool cmp

(node a, node b)

intlowbit

(int k)

void

update

(int t,

int value)

intgetsum

(int t)

intmain()

sort

(a +

1, a + n +

1,cmp)

;//從1到n排序,cmp容易忘

memset

(c,0

,sizeof

(c))

;for

(i =

1; i <= n; i++

) aa[a[i]

.order]

= i;

int ans =0;

for(i =

1; i <= n; i++

)printf

("%i64d\n"

, ans);}

return0;

}

樹狀陣列求逆序對

題目描述 給定乙個陣列a,它包含n個整數,分別是a 1 a 2 a n 如果存在下標i和j,使得 i j 且 a i a j 同時成立,則 i,j 就為乙個 逆序對 那麼a陣列總共有多少對不同的 逆序對 輸入格式 1247.in 第一行為n 1 n 100000 接下來是n行,每行乙個長整型範圍內的...

樹狀陣列求逆序對

很久以前就學了樹狀陣列,也知道可以用來求逆序對,然而一直沒弄明白他是怎麼實現的 可能當時沒搞清楚逆序對是什麼吧。逆序對就是如果i j a i a j 這兩個就算一對逆序對,簡單來說,所有逆序對的個數和就是找每乙個數的前面有幾個比他的大的數,他們加起來的和就是逆序對的總數。知道什麼是逆序對後就好辦了,...

樹狀陣列 求逆序對

樹狀陣列可以解決線段樹能夠解決的問題,且更加節省空間。線段樹的講解 可以看這位大佬的部落格 樹狀陣列的講解 另一位大佬的部落格 這裡主要寫一下利用樹狀陣列來求解逆序對的個數。簡單來說就是一段序列裡面每個數所在位置之前的位置上比這個數大的數字個數之和。例如 1 2 3 5 4 只有 4 前面的 有乙個...