逆序对数量(归并)

输入数据:
6 2 3 4 5 6 1
期望输出:
5
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+9;
typedef long long ll;
int n;
int q[N],temp[N];
ll merge_sort(int l,int r)
{
if(l>=r) return 0;
int mid =l+r>>1;
ll res =merge_sort(l,mid)+merge_sort(mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j]) temp[k++]=q[i++];
else
{
temp[k++] =q[j++];
res +=mid-i+1;
}
}
while(i<=mid) temp[k++]=q[i++];
while(j<=r) temp[k++] =q[j++];
for(int i=l,j=0;i<=r;i++,j++)
q[i]=temp[j];
return res ;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&q[i]);
}
cout<<merge_sort(0,n-1);
}

浙公网安备 33010602011771号