歸併排序是將數列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]前面的話,逆序數要加上mid+1-i。因此,可以在歸併
排序中的合併過程中計算逆序數.複雜度為nlogn.樹狀陣列也可以求.以後再補充。。。
**:
#include#include#includeusing namespace std;
#define ll long long
const int n = 5e5+5;
ll ans;
int a[n],tp[n],n;
void mg(int arr,int l,int r)else
}while(i<=m) tp[k++]=arr[i++];
while(j<=r) tp[k++]=arr[j++];
for(int i=1;i=r) return ;
else
}int main()
}
poj2299 歸併排序求逆序數
poj2299 逆序數 逆序數就是你如果只能交換臨近的兩個數,那麼將乙個序列變為有序序列所需要的最少交換次數 穩定的排序演算法按理來說都可以求,但通常使用歸併排序可以求逆序數,因為它的時間效率還是很高的,之所以遜於快排,還是因為它對空間的占用稍多,而且用到了迭代吧 提到逆序數我都第乙個想到歸併。思路...
POJ 2299 歸併排序求逆序數
poj 2299 用歸併排序來求,也是相似的道理,都是求在前面比自己大的數有幾個。歸併排序是穩定排序,所以可以這麼做 插入排序和希爾排序按理也可以,只是效率更沒那麼高 歸併排序在歸併兩個子段的時候,子段都是已經排好序的 因為回溯 相對位置在右邊的子段的元素如果小於相對位置在左邊的子段的元素,說明在原...
poj 2299 逆序數 歸併排序
陷阱啊!一開始我用氣泡排序 bubble sort 來統計。暈,tle。each case 50w.而一趟氣泡排序需要進行的是n 1,n 2,2,1,0的和次比較。即n n 1 2次。總的時間複雜度為o n 2 肯定是吃不消的。於是,可以用歸併排序來求它的逆序數,逆序即為它總共需要變換的次數。這樣時...