#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll s[500010],b[500010],cnt;
void merge(ll l,ll mid,ll r)
{
ll i=l,j=mid+1,t=0;
while(i<=mid&&j<=r)
{
if(s[i]>s[j])
{
b[t++]=s[j++];
cnt+=mid-i+1;
}
else b[t++]=s[i++];
}
while(i<=mid) b[t++]=s[i++];
while(j<=r) b[t++]=s[j++];
for(i=0;i<t;i++) s[l+i]=b[i];
}
void mergesort(ll l,ll r)
{
if(l<r)
{
ll mid=(l+r)/2;
mergesort(l,mid);
mergesort(mid+1,r);
merge(l,mid,r);
}
}
int main()
{
ll n;
cnt=0;
cin>>n;
for(ll i=0;i<n;i++)
cin>>s[i];
mergesort(0,n-1);
printf("%lld",cnt);
}
洛谷P1908 逆序对(归并排序)
最新推荐文章于 2024-08-18 08:31:43 发布