第1行:N,N为序列的长度(n <= 50000) 第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)
输出逆序数
4
2
4
3
1
4
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int a[50020],b[50020]; 5 int n; 6 long long merge(int low,int mid,int high){ 7 int i=low,j=mid+1,k=low; 8 long long count=0; 9 while(i<=mid&&j<=high){ 10 if(a[i]<=a[j]){ 11 b[k++]=a[i++]; 12 } 13 else{ 14 b[k++]=a[j++]; 15 count+=j-k; 16 } 17 } 18 while(i<=mid){ 19 b[k++]=a[i++]; 20 } 21 while(j<=high){ 22 b[k++]=a[j++]; 23 } 24 for(i=low;i<=high;i++){ 25 a[i]=b[i]; 26 } 27 return count; 28 } 29 long long mergeSort(int x,int y){ 30 31 if(x<y){ 32 int mid=(x+y)/2; 33 long long count=0; 34 count+=mergeSort(x,mid); 35 count+=mergeSort(mid+1,y); 36 count+=merge(x,mid,y); 37 return count; 38 } 39 return 0; 40 } 41 int main(){ 42 cin>>n; 43 for(int i=0;i<n;i++){ 44 scanf("%d",&a[i]); 45 } 46 cout<<mergeSort(0,n-1); 47 return 0; 48 }
原文:https://www.cnblogs.com/sz-wcc/p/10420304.html