歸並排序&&逆序對(codves1688,4163)
阿新 • • 發佈:2017-05-29
如果 排序 範圍 eight 註意 sam def 序列 pad
加上這句就完啦,最後輸出ans就可以了。
為什麽是加mid-q+1呢?
歸並排序
歸並排序采用的是分治的思想
1、劃分問題:把序列分為元素個數盡量相等的兩半
2、遞歸求解:把兩半分別排序
3、合並問題:把兩個有序的序列合並為一個
對於第三個問題,我們可以從兩個序列中最小的元素開始比較,把較小的加入新的隊列中,直到某個序列為空,把另外的一個序列直接加入,然後將原來的序列覆蓋。其實很簡單,下面看看模板代碼
寫得爛,不要在意(⊙o⊙)…;
這個就是歸並排序(⊙o⊙)…,本人感覺很簡單的,歸並排序好像比sort,快排的復雜度低,也就是說快一點,是NlogN的復雜度。既然說了歸並排序,就不得不說下逆序對如codevs 1688 模板題
1688 求逆序對
題目描述 Description給定一個序列a1,a2,…,an,如果存在i<j並且ai>aj,那麽我們稱之為逆序對,求逆序對的數目
!!!!!!數據範圍:N<=105。Ai<=105。時間限制為1s。//註意這裏範圍
輸入描述 Input Description
第一行為n,表示序列長度,接下來的n行,第i+1行表示序列中的第i個數。
輸出描述 Output Description所有逆序對總數.
樣例輸入 Sample Input4
3
2
3
2
樣例輸出 Sample Output3
數據範圍及提示 Data Size & Hint 對於逆序對如果範圍小,可以用冒泡排序,交換一次ans++;最後排好了答案就出來了。但是冒泡排序是O(n^2)的復雜度,一看數據範圍是1e5 就知道要超時。所以就用歸並排序,來實現問題。其實只需要加一句代碼就行了我們在進行合並的時候是從小到大進行的,就是說,當把右段的數x放到臨時數組t中的時候,左段的數一定比x都大,有mid-p+1個,這些數一定都和x成逆序對,因為他們的位置在x前,而值比x大。
這就是逆序對的解法。
歸並排序&&逆序對(codves1688,4163)