歸併法求逆序數

2021-09-06 08:28:15 字數 1097 閱讀 8003

求逆序數

時間限制:

2000 ms  |  記憶體限制:

65535 kb

難度:5

描述

在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。

現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。

比如 1 3 2 的逆序數就是1。

輸入

第一行輸入乙個整數t表示測試資料的組數(1<=t<=5) 每組測試資料的每一行是乙個整數n表示數列中共有n個元素(2〈=n〈=1000000) 隨後的一行共有n個整數ai(0<=ai<1000000000),表示數列中的所有元素。

資料保證在多組測試資料中,多於10萬個數的測試資料最多只有一組。

輸出輸出該數列的逆序數

樣例輸入

2

21 1

31 3 2

樣例輸出

0

1

1

//可以直接雙重for迴圈

2 #include3 #include4 #include5

#define n 1000010

6using

namespace

std;

7long

long

ans;

8int

a[n];910

void merge(int s1,int e1,int s2,int

e2)11

22else

2328}29

while(p1<=e1) temp[p++]=a[p1++];

30while(p2<=e2) temp[p++]=a[p2++];

31int

i;32

for(i=s1;i<=e2;i++) a[i]=temp[i-s1];

33delete temp;34}

3536

void merge_sort(int s,int

e)3746}

4748

intmain()

4962 }

歸併法排序求逆序數

歸併排序 merge sort,台灣譯作 合併排序 是建立在歸併操作上的一種有效的 排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。歸併操作 merge 也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。歸併排序演算法依賴歸併操作。歸併操作...

歸併 求逆序數

考慮1,2,n n 100000 的排列i1,i2,in,如果其中存在j,k,滿足 j k 且 ij ik,那麼就稱 ij,ik 是這個排列的乙個逆序。乙個排列含有逆序的個數稱為這個排列的逆序數。例如排列 263451 含有8個 逆序 2,1 6,3 6,4 6,5 6,1 3,1 4,1 5,1 ...

求逆序數 逆序數 歸併排序

求排列的逆序數 分治 一 題目描述 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1...