輸入: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 ...