歸併排序求逆序數

2021-08-21 19:24:22 字數 914 閱讀 9963

輸入:n:陣列中元素個數

x:最後所存在的每對逆序對所需要花費的錢

y:按任意順序交換陣列中相鄰兩個元素所要花費的錢

n個陣列中元素

輸出:求使陣列變為公升序所需要的最少**

即求該陣列的逆序數(按陣列順序/任意順序交換次數均為該陣列的逆序數次)

歸併排序求逆序數:歸併排序採用分治策略

ex:

重點在於合併:合併時,假如在中點前(即合併前的左序列)有乙個元素arr [i]要大於在中點後(即合併前的右邊序列)的乙個元素arr[j],那麼序數i後面的元素應該都要大於arr[j],逆序數為(m – i+ 1)

/*歸併排序求逆序數*/

/*hdu - 6318*/

#includeusing namespace std;

#define ll long long

ll arr[100005];

ll tmp[100005];

ll ans;

void merge_solve(ll l,ll m,ll r)

else

}while(i<=m)

while(j<=r)

for(int u=l; u<=r; u++)

arr[u]=tmp[u];

/*把這個區間內修改好的陣列放回去*/

}void merge_sort(ll l,ll r)

}int main()

merge_sort(0,n-1);

printf("%i64d\n",ans*min(x,y));

}return 0;

}

求逆序數 逆序數 歸併排序

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

歸併排序 求逆序數

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

歸併排序 求逆序數

time limit 50 ms memory limit 65536 kib problem description 對於數列a1,a2,a3 中的任意兩個數ai,aj i j 如果ai aj,那麼我們就說這兩個數構成了乙個逆序對 在乙個數列中逆序對的總數稱之為逆序數,如數列 1 6 3 7 2 ...