樹狀陣列求逆序對

2022-04-30 02:00:08 字數 819 閱讀 7731

逆序對的概念我就不講了,關於這個求逆序對的問題,通俗的方法自然是要麼遍歷o(n^2),要麼歸併排序(nlog n ),那麼如何用樹狀陣列實現呢?

下面看一道題目

涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。 現在將每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 兩列火柴之間的距離定義為: ∑(ai-bi)^2

其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。

每列火柴中相鄰兩根火柴的位置都可以交換,請你通過交換使得兩列火柴之間的距離最小。請問得到這個最小的距離,最少需要交換多少次?如果這個數字太大,請輸出這個最小交換次數對 99,999,997 取模的結果。

我將基於這題講下去

首先通過數學證明加上離散化我們可以得到乙個陣列c[i],含義就是對於a火柴盒中的每乙個位置i,在b中本該對應的位置(反過來也可以),那麼問題就轉化成了在c[i]陣列中求逆序對的問題

下面我提供關鍵**

void add(int x,int y)

int ask(int x)

for(int i=n;i>=1;i--)

最後輸出ans就好了

問什麼呢???

仔細分析一下

假設在ans+=ask(c[i]-1)之中,現在i=i0,有字首可以給你加,那麼這個字首是怎麼來的呢?

很顯然,是通過第一步中來的.那麼我們發現,由於i是從n遞減,在c[i]中,一定有之前字首和值個數字於現在的位置之前,並且它們在順序的陣列中的位置還要在c[i0]之前,也就是小於i0。因此我們只需要求字首和就能知道逆序對的個數。

由此原理計算逆序對

樹狀陣列求逆序對

題目描述 給定乙個陣列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 前面的 有乙個...