思路:利用归并排序,先分解区间。最后合并区间的时候找到逆序的个数。(可以画图来理解归并排序)
代码:

1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int a[50005]; 6 int res[50005]; 7 int ans; 8 9 void merge(int l,int r){ 10 //cout<<l<<" "<<r<<endl; 11 int mid = (l+r)>>1; 12 int i = l,j = mid+1; 13 int cur = l; 14 while(i <= mid && j <= r){ 15 if(a[i] <= a[j]) 16 res[cur++] = a[i++]; 17 else{ 18 res[cur++] = a[j++]; 19 ans += mid-i+1; //找到逆序的个数 20 } 21 } 22 while(i <= mid) res[cur++] = a[i++]; 23 while(j <= r) res[cur++] = a[j++]; 24 for(int i = l;i <= r;i ++) a[i] = res[i]; 25 } 26 void mer_sort(int l,int r){ 27 if(l < r){ 28 int mid = (l+r)>>1; 29 mer_sort(l,mid); //分解 30 mer_sort(mid+1,r); //分解 31 merge(l,r); //合并 32 } 33 } 34 int main() 35 { 36 int n; 37 while(cin>>n){ 38 for(int i = 1;i <= n;i ++) cin>>a[i]; 39 40 ans = 0; 41 mer_sort(1,n); 42 cout<<ans<<endl; 43 } 44 return 0; 45 }