歸併排序 求逆序數

2021-09-09 09:27:44 字數 1522 閱讀 1677

time limit: 50 ms memory limit: 65536 kib

problem description

對於數列a1,a2,a3…中的任意兩個數ai,aj (i < j),如果ai > aj,那麼我們就說這兩個數構成了乙個逆序對;在乙個數列中逆序對的總數稱之為逆序數,如數列 1 6 3 7 2 4 9中,(6,4)是乙個逆序對,同樣還有(3,2),(7,4),(6,2),(6,3)等等,你的任務是對給定的數列求出數列的逆序數。

input

輸入資料n(n <= 100000)表示數列中元素的個數,隨後輸入n個正整數,數字間以空格間隔。

output

輸出逆序數。

sample input

10

10 9 8 7 6 5 4 3 2 1

sample output

歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

時間複雜度:o(n log n)

思路:有點像線段樹(所以時間複雜度上會優化),但是我們只需要對區間進行排序就好了,沒必要真的寫成線段樹。

#include

using

namespace std;

int n,a[

100010

],b[

100010];

//a陣列儲存輸入,b陣列是對區間進行排序時用到的

long

long

int ans;

//這道題記得要開long long,ans代表的是逆序對的對數

void

build

(int l,

int r)

//這裡就是有點像建樹的操作了

else

//因為在這之前兩邊的區間都是有序的,所以a[j] < a[i]的時候,比如

}while

(i <= mid)

//沒弄完的接上

while

(j <= r)

for(

int i =

0;i < top; i++

)//我們要通過b陣列來更新a陣列讓a陣列有序,上面的操作

return;}

intmain()

build(0

,n-1);

printf

("%lld"

,ans)

;return0;

}

求逆序數 逆序數 歸併排序

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

歸併排序 求逆序數

首先需要了解逆序對的概念 如果在乙個序列 數列中,滿足 則ax和ay稱為一對逆序對。現在考慮乙個問題 對乙個大小為n 即有n個元素 元素隨機無序且唯一的整數序列中,平均有多少個逆序對?乙個構造證明的方法如下 設乙個隨機無序且元素唯一的整數序列為 我們令lr為l的反向序列,即 然後在lr中任取兩個數,...

歸併排序求逆序數

輸入 n 陣列中元素個數 x 最後所存在的每對逆序對所需要花費的錢 y 按任意順序交換陣列中相鄰兩個元素所要花費的錢 n個陣列中元素 輸出 求使陣列變為公升序所需要的最少 即求該陣列的逆序數 按陣列順序 任意順序交換次數均為該陣列的逆序數次 歸併排序求逆序數 歸併排序採用分治策略 ex 重點在於合併...