题意:
给出 \(n\) 个数,求逆序对数
解析:
归并排序
//归并排序
#include<cstdio>
#define N 500005
#define re register
using namespace std;
int n,a[N],b[N];
long long ans;
void m_sort(int l,int r);
inline int read();
int main()
{
n=read();
for(re int i=1;i<=n;i++)
a[i]=read();
m_sort(1,n);
printf("%lld",ans);
return 0;
}
inline int read()
{
re int s=0,w=1;
re char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
void m_sort(int l,int r)
{
if(l==r)
return ;
re int mid=(l+r)>>1;
re int i=l,j=l;
re int k=mid+1;
m_sort(l,mid); m_sort(mid+1,r);
while(i<=mid&&k<=r)
{
if(a[i]<=a[k])
b[j++]=a[i++];
else
{
ans+=mid-i+1;
b[j++]=a[k++];
}
}
while(i<=mid)
b[j++]=a[i++];
while(k<=r)
b[j++]=a[k++];
for(re int i=l;i<=r;i++)
a[i]=b[i];
}