#include <bits/stdc++.h>
using namespace std;
//使用暴力枚举法会超时,故本题采用归并排序法,计算共交换了多少次
#define Max 1000000
long long int num=0;
long long int t[Max],h[Max];
long long int sort1(long long int a,long long int b)
{
if(a>=b)
return 0;
long long int mid=a+b>>1;
num=sort1(a,mid) + sort1(mid+1,b);
long long int i=a,j=mid+1;
long long int k=0;
while(i<=mid&&j<=b)
{
if(t[i]<=t[j])
h[k++]=t[i++];
else
{
num+=mid-i+1;//出现逆序对
h[k++]=t[j++];
}
}
while(i<=mid)
h[k++]=t[i++];
while(j<=b)
h[k++]=t[j++];
for(int i=a,j=0;i<=b;++i,++j)
{
t[i]=h[j];
}
return num;
}
int main()
{
long long int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>t[i];
}
cout<<sort1(0,n-1);
return 0;
}
逆序对..
最新推荐文章于 2025-08-15 09:45:14 发布