C C 程式設計學習 第20周 逆序數

2021-10-18 17:57:07 字數 1770 閱讀 4194

題目鏈結

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

如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。

input

第1行:n,n為序列的長度(n <= 50000) 第2 - n + 1行:序列中的元素(0 <= ai

<= 109)

output

輸出逆序數

424

31

4
思路一:歸併排序,思路看**和注釋吧。

c++**:

#include

using

namespace std;

int g_ncount;

void

mergearray

(int a,

int first,

int mid,

int last,

int temp)

}while

(i <= m)

temp[k++

]= a[i++];

while

(j <= n)

temp[k++

]= a[j++];

for(i =

0; i < k; i++

) a[first + i]

= temp[i];}

void

mergesort

(int a,

int first,

int last,

int temp)

}bool

mergesort

(int a,

int n)

int a[

50005];

intmain()

return0;

}

思路二:樹狀陣列求逆序數。因為樹狀陣列下標是從1開始的,所以用陣列存的時候下標也要從1開始。然後給乙個陣列排序,再二分查詢在排序後的陣列中的位置。舉個例子:2 4 3 1,排序後就是1 2 3 4,然後原陣列中第乙個元素2在第二個位置,4在第四個位置,然後找逆序就是該位置之後的元素個數,因為已經排好序了嘛,後面的元素肯定比前面的大,如果在該元素出現之前,已經有比它大的元素出現了,那麼它就是乙個逆序。

c++**:

#include

using

namespace std;

const

int maxn =

50005

;int bit[maxn]

, n, a[maxn]

, b[maxn]

;int

lowbit

(int x)

intsum

(int i)

return s;

}void

add(

int i,

int x)

}void

init()

intmain()

sort

(a +

1, a + n +1)

;int ans =0;

for(

int i =

1; i <= n; i++

)printf

("%d\n"

, ans);}

return0;

}

C C 程式設計學習 第6周 A B問題

題目鏈結 相信你已經學會 a b 問題了,那麼問題又來了 輸入兩個正整數 a 和 b 求 a b。輸入格式 一行,包含兩個正整數 a 和 b,中間用單個空格隔開。1 a,b 50000。輸出格式 乙個整數,即 a b 的值。3 412注意int可能存不下,所以要開long long。c語言 incl...

C C 程式設計學習 第7周 合影效果

題目鏈結 蒜頭君和朋友們去爬香山,為美麗的景色所陶醉,想合影留念。如果他們站成一排,男生全部在左 從拍照者的角度 並按照從矮到高的順序從左到右排,女生全部在右,並按照從高到矮的順序從左到右排,請問他們合影的效果是什麼樣的 所有人的身高都不同 輸入格式 第一行是人數 n 2 n 40,且至少有 1 個...

C C 程式設計學習 第7周 單詞翻轉

題目鏈結 輸入乙個句子 一行 將句子中的每乙個單詞翻轉後輸出。輸入格式 只有一行,為乙個字串,不超過 500 個字元。單詞之間以空格隔開。輸出格式 翻轉每乙個單詞後的字串,單詞之間的空格需與原文一致。注意字串開頭和結尾可能有空格。hello worldolleh dlrow輸入一行帶空格的字串,每個...