CODEVS 1688 求逆序對

2021-09-10 07:00:10 字數 1716 閱讀 9988

題目描述 description

給定乙個序列a1,a2,…,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目

資料範圍:n<=10^5。

ai<=10^5。時間限制為1s。

輸入描述 input description

第一行為n,表示序列長度,接下來的n行,第i+1行表示序列中的第i個數。

輸出描述 output description

所有逆序對總數.

樣例輸入 sample input43

232樣例輸出 sample output

3該題為典型的分治題目,其中利用了歸併排序的思想

逆序對對數由兩種組成

(1)陣列左半部分和陣列右半部分的逆序對對數之和

(2)乙個數在左半部分,另乙個數在右半部分的逆序對對數

題解將在**中的注釋中呈現

以下為**

(萌新為保險起見都用了long long型)

#include

#include

#define max 100002

using namespace std;

long

long a[max]

,b[max]

,cnt=0;

void

mergesortandcnt

(long

long a,

long

long s,

long

long e,

long

long b)

;//利用遞迴函式,將大陣列分解為小陣列,進行排序,並計算逆序對的對數

void

merge

(long

long a,

long

long s,

long

long m,

long

long e,

long

long b)

;//用來將排好序的兩組陣列,按順序歸併到乙個陣列裡,此題解運用**從大到小**的順序排列

intmain()

void

mergesortandcnt

(long

long a,

long

long s,

long

long e,

long

long b)

}merge

(a,s,m,e,b)

;//歸併排好序的兩個陣列}}

void

merge

(long

long a,

long

long s,

long

long m,

long

long e,

long

long b)

//歸併排好序的兩個陣列

//p1,p2可能未到右邊界,以下兩個迴圈將剩下的元素放入臨時陣列中

while

(p1<=m)

b[pb++

]=a[p1++];

while

(p2<=e)

b[pb++

]=a[p2++];

for(

int i=

0;i1;i++

) a[s+i]

=b[i]

;//注意必須是s+i

}

CodeVS1688 求逆序對

給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目 第一行為n,表示序列長度,接下來的n行,第i 1行表示序列中的第i個數。所有逆序對總數.資料範圍 n 105。ai 105。時間限制為1s。歸併排序,合併的時候,如果a i a j 那麼a i mid a j 所以給...

AC日記 codevs 1688 求逆序對

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目 資料範圍 n 105。ai 105。時間限制為1s。輸入描述 input description 第一行為n,表示序列長度,接下來...

codevs1688 求逆序對 權值線段樹

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目 資料範圍 n 105。ai 105。時間限制為1s。輸入描述 input description 第一行為n,表示序列長度,接下來...