https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1019
思想:
所谓的归并排序,是使连个数组分别有序,再将这两个有序的数组存入另外一个数组中,实现最后的有序。
在归并的同时,我们可以记录下此时左侧比右侧大的位置即可
#include <iostream>
#include <stdio.h>
using namespace std;
int a[50010];
int tep[50010];
int ans=0;
void merge_sort(int l,int r)
{
int i,j,k;
int m=(l+r)>>1;
i=l,k=l,j=m+1;
while(j<=r&&i<=m)
{
if(a[i]>a[j])
{
tep[k++]=a[j++];
ans+=1+m-i ;//这一步想了好久,原因在于如果最后剩下了左半面,那么剩下的都是有序的,所以只需要记录下中值到此的长度即可。
}
else
tep[k++]=a[i++];
}
while(i<=m)
tep[k++]=a[i++];
while(j<=r)
tep[k++]=a[j++];
for(i=l;i<=r;i++)
a[i]=tep[i];
}
void solve(int l,int r)
{
int m=(l+r)>>1;
if (l<r)
{
solve(l,m);
solve(m+1,r);
merge_sort(l,r);
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
solve(1,n);
cout<<ans<<endl;
return 0;
}