題意:給定乙個序列,每次只能交換鄰近的兩個元素,問要交換多少次才能使序列按公升序排列。
思路:本質就是求逆序對。我們用歸併排序求逆序對,這也是簡單的cdq分治。
#include#include#include
#include
using
namespace
std;
typedef
long
long
ll;const
int maxn=5e5+5
;int
n,a[maxn],tmp[maxn];
ll ans;
void merge_sort(int l,int
r) }
for(int i=l;i<=r;++i)
a[i]=tmp[i];
}int
main()
return0;
}
poj2299 歸併排序求逆序數
poj2299 逆序數 逆序數就是你如果只能交換臨近的兩個數,那麼將乙個序列變為有序序列所需要的最少交換次數 穩定的排序演算法按理來說都可以求,但通常使用歸併排序可以求逆序數,因為它的時間效率還是很高的,之所以遜於快排,還是因為它對空間的占用稍多,而且用到了迭代吧 提到逆序數我都第乙個想到歸併。思路...
POJ 2299 歸併排序求逆序數
poj 2299 用歸併排序來求,也是相似的道理,都是求在前面比自己大的數有幾個。歸併排序是穩定排序,所以可以這麼做 插入排序和希爾排序按理也可以,只是效率更沒那麼高 歸併排序在歸併兩個子段的時候,子段都是已經排好序的 因為回溯 相對位置在右邊的子段的元素如果小於相對位置在左邊的子段的元素,說明在原...
歸併排序求逆序數(POJ 2299)
歸併排序是將數列a l,h 分成兩半a l,mid 和a mid 1,h 分別進行歸併排序,然後再將這兩半合併起來。在合併的過程中 設l i mid,mid 1 j h 當a i a j 時,並不產生逆序數 當a i a j 時,在 前半部分中比a i 大的數都比a j 大,將a j 放在a i 前...