C1 A 求逆序對個數

2021-10-25 05:14:58 字數 1421 閱讀 1632

時間限制: 300 ms 記憶體限制: 65536 kb

題目鏈結

給定乙個整數序列,求逆序對的個數

輸入

第乙個數為序列長度n

接下來一行,n個整數,保證在int範圍內

輸出

輸出一行,逆序對的個數

輸入樣例

5

5 4 3 2 1

輸出樣例

資料範圍1≤n≤105

一般思路是對於每乙個資料都向後搜尋比它大的數,但這種方法的時間複雜度是o(n2)

最後我們只需要把每一次求出來的個數相加就能求得逆序對的個數。

#include

#include

#include

#include

#include

long

long

int count=0;

//int不夠存

void

merge

(int x,

int tmp,

int left,

int leftend,

int rightend)

else

while

(i<=leftend)

tmp[q++

]=x[i++];

while

(j<=rightend)

tmp[q++

]=x[j++];

for(i=left; i<=rightend; i++

) x[i]

=tmp[i];}

void

msort

(int k,

int tmp,

int left,

int right)

}void

mergesort

(int k,

int n)

else

printf

("no space for tmp array!!!\n");

}//以上三段是經典的歸併排序,求逆序對的時候僅僅加了一行**而已

intmain()

mergesort

(a,n)

;printf

("%lld"

,count)

;free

(a);

return0;

}

遞迴求逆序對個數

給定輸入n,之後輸入1到n的乙個排列,求排列中的逆序對的個數 思路一 思路二 思路二 實現 include include include using namespace std 歸併,並計算出逆序數的個數 intmerge int a,int s,int mid,int e,int b else ...

分治 求逆序對個數並列印逆序對

如果用最hick的方法去求那麼就是o n 2 的複雜度,如果想優化的話,用歸併排序的方法分治處理。主要思想 總逆序 左邊逆序 右邊逆序 左邊右邊分別排序後的逆序 include includeusing namespace std 用歸併排序的思想來求,歸併排序為o nlogn 的時間複雜度,比暴力...

求逆序對個數(分治)

求逆序對個數 在歸併排序 從大到小 的合併過程前,對兩個分支進行逆序對數的計算 該計算過程為o n include include include define n 100005 using namespace std int a n b n void merge int a,int s,int m...