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