luogu#P1908 逆序对

题意:

给出 \(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];
}


posted @ 2019-10-29 20:19  nenT  阅读(96)  评论(0)    收藏  举报