题目描述 题目链接
题目分析
对归并排序的改编
主要思想:当两个有序数列左边的第i个数据>右边的第j个数据,则说明i~mid的数据都>右边的第j个数据所以res+=mid+1-i;
代码展示
#include<iostream>
int const maxn=1e5+10;
using namespace std;
typedef long long LL;
int q[maxn],temp[maxn];
LL res;
LL merge_sort(int q[],int l,int r)
{
if(l>=r) return 0;
int mid=l+r>>1;
res=merge_sort(q,l,mid)+merge_sort(q,mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j]) temp[k++]=q[i++];
else
{
temp[k++]=q[j++];
res+=mid+1-i;
}
}
while(i<=mid) temp[k++]=q[i++];
while(j<=r) temp[k++]=q[j++];
for(int i=0,j=l;j<=r;i++,j++) q[j]=temp[i];
return res;
}
int main()
{
int n;cin>>n;
for(int i=0;i<n;i++) scanf("%d",&q[i]);
printf("%lld",merge_sort(q,0,n-1));
}