归并排序求逆序对
Posted shulin~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序求逆序对相关的知识,希望对你有一定的参考价值。
【AC】
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 const int maxn=1e5+2; 6 int a[maxn]; 7 int tmp[maxn]; 8 int n; 9 ll ans; 10 void Merge(int l,int m,int r) 11 { 12 int i=l,j=m+1; 13 int k=l; 14 while(i<=m&&j<=r) 15 { 16 if(a[i]<=a[j]) 17 { 18 tmp[k++]=a[i++]; 19 } 20 else 21 { 22 tmp[k++]=a[j++]; 23 ans+=(ll)(m-i+1); 24 } 25 } 26 while(i<=m) tmp[k++]=a[i++]; 27 while(j<=r) tmp[k++]=a[j++]; 28 for(int i=l;i<=r;i++) 29 { 30 a[i]=tmp[i]; 31 } 32 } 33 34 void Merge_Sort(int l,int r) 35 { 36 if(l<r) 37 { 38 int mid=(l+r)>>1; 39 Merge_Sort(l,mid); 40 Merge_Sort(mid+1,r); 41 Merge(l,mid,r); 42 } 43 } 44 int main() 45 { 46 while(~scanf("%d",&n)) 47 { 48 for(int i=0;i<n;i++) 49 { 50 scanf("%d",&a[i]); 51 } 52 ans=0; 53 Merge_Sort(0,n-1); 54 printf("%lld\n",ans); 55 } 56 return 0; 57 }
以上是关于归并排序求逆序对的主要内容,如果未能解决你的问题,请参考以下文章