題目描述 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,表示序列長度,接下來...