# include<iostream>
using namespace std;
typedef long long LL;
LL am[100005],bm[100005];
long long int sum = 0;
void merge(int begin,int mid,int end)
{
//将am中的赋值给bm,因为数组不能原地赋值
for(int i=begin;i<=end;i++)
bm[i] = am[i];
int i = begin,j = mid+1,k=begin;
while(i < mid+1 && j < end+1)
{
if(bm[i]<=bm[j])
{
am[k++] = bm[i++];
}
else
{
// cout<<i<<" "<<j<<" "<<mid-i+1<<endl;
sum += (mid-i+1);
am[k++] = bm[j++];
}
}
while(i < mid+1)
am[k++] = bm[i++];
while(j < end+1)
am[k++] = bm[j++];
}
void MergeSort(int s,int t)
{
if(t>s)
{
//划分中点;
int mid = (s+t)/2;
MergeSort(s,mid);
MergeSort(mid+1,t);
//合并
merge(s,mid,t);
}
}
int n;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>am[i];
MergeSort(0,n-1);
/* for(int i=0;i<n;i++)
cout<<am[i]<<" ";*/
cout<<sum;
return 0;
}
二路归并排序求逆序数
最新推荐文章于 2023-03-08 19:01:09 发布