求逆序對(歸併排序)

2021-09-03 01:55:00 字數 945 閱讀 5008

貓貓tom和小老鼠jerry最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的遊戲,現在他們喜歡玩統計。最近,tom老貓查閱到乙個人類稱之為「逆序對」的東西,這東西是這樣定義的:對於給定的一段正整數序列,逆序對就是序列中ai>aj且i輸入格式:

第一行,乙個數n,表示序列中有n個數。

第二行n個數,表示給定的序列。序列中每個數字不超過10^9109

輸出格式:

給定序列中逆序對的數目。

輸入樣例#1:複製

6

5 4 2 6 3 1

輸出樣例#1:複製

11
對於25%的資料,n \leq 2500n≤2500

對於50%的資料,n \leq 4 \times 10^4n≤4×104。

對於所有資料,n \leq 5 \times 10^5n≤5×105

請使用較快的輸入輸出

應該不會n方過50萬吧 by chen_zhe

#include #includeusing namespace std;

int a[500006];

int b[500006];

long long ans=0;

void merge_sort(int l,int r)

else

}while(i<=mid)

b[s++]=a[i++];

while(j<=r)

b[s++]=a[j++];

for(int k=l;k<=r;k++)

a[k]=b[k];

}int main()

merge_sort(1,n);

cout

}

歸併排序求逆序對

排序都用qsort了,別的排序演算法不怎麼用,但有些排序的思想很重要。碰到一道求逆序對的題,要用到歸併排序,學習了一下歸併排序。歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟 分解 將n個元素分成個含n 2個元素的子串行。解決 用合併排序法對兩個子串行遞迴的排序。合併 合併兩個已排序的子串行...

歸併排序求逆序對

我們知道,求逆序對最典型的方法就是樹狀陣列,但是還有一種方法就是merge sort 即歸併排序。實際上歸併排序的交換次數就是這個陣列的逆序對個數,為什麼呢?我們可以這樣考慮 歸併排序是將數列a l,h 分成兩半a l,mid 和a mid 1,h 分別進行歸併排序,然後再將這兩半合併起來。在合併的...

歸併排序求逆序對

現在給定乙個有n個數的數列ai。若對於i j,有ai aj,則稱 i,j 為數列的乙個逆序對。例如,2,3,8,6,1 有五個逆序對,分別是 1,5 2,5 3,4 3,5 4,5 現在請你求出乙個給定數列的逆序對個數。輸入格式 乙個整數t,表示有多少組測試資料。每組測試資料第一行是乙個正整數n 1...