思路:利用归并排序,先分解区间。最后合并区间的时候找到逆序的个数。(可以画图来理解归并排序)
代码:
#include <iostream>
#include <cstring>
using namespace std;
int a[50005];
int res[50005];
int ans;
void merge(int l,int r){
//cout<<l<<" "<<r<<endl;
int mid = (l+r)>>1;
int i = l,j = mid+1;
int cur = l;
while(i <= mid && j <= r){
if(a[i] <= a[j])
res[cur++] = a[i++];
else{
res[cur++] = a[j++];
ans += mid-i+1; //找到逆序的个数
}
}
while(i <= mid) res[cur++] = a[i++];
while(j <= r) res[cur++] = a[j++];
for(int i = l;i <= r;i ++) a[i] = res[i];
}
void mer_sort(int l,int r){
if(l < r){
int mid = (l+r)>>1;
mer_sort(l,mid); //分解
mer_sort(mid+1,r); //分解
merge(l,r); //合并
}
}
int main()
{
int n;
while(cin>>n){
for(int i = 1;i <= n;i ++) cin>>a[i];
ans = 0;
mer_sort(1,n);
cout<<ans<<endl;
}
return 0;
}