归并求逆序数
Problem Description
对于数列a1,a2,a3…中的任意两个数ai,aj (i < j),如果ai > aj,那么我们就说这两个数构成了一个逆序对;在一个数列中逆序对的总数称之为逆序数,如数列 1 6 3 7 2 4 9中,(6,4)是一个逆序对,同样还有(3,2),(7,4),(6,2),(6,3)等等,你的任务是对给定的数列求出数列的逆序数。
Input
输入数据N(N <= 10000)表示数列中元素的个数,随后输入N个正整数,数字间以空格间隔。
Output
输出逆序数。
Example Input
10 10 9 8 7 6 5 4 3 2 1
Example Output
45
代码如下:
<pre name="code" class="cpp">#include<iostream>
#include<cstdio>
using namespace std;
int a[110000],t[110000];
long long c;
void merge_sort(int *A,int x,int y,int *T)
{
if(x<y-1)
{
int m=(y+x)/2;
int p=x,q=m,i=x;
merge_sort(A,x,m,T);
merge_sort(A,m,y,T);
while(p<m||q<y)
{
if(q>=y||(p<m&&A[p]<=A[q]))
T[i++]=A[p++];
else
{
T[i++]=A[q++];
c+=m-p;
}
}
for(i=x; i<y; i++) A[i]=T[i];
}
}
int main()
{
int n,i;
while(~scanf("%d",&n))
{
c=0;
for(i=0; i<n; i++)
scanf("%d",&a[i]);
merge_sort(a,0,n,t);
cout<<c<<endl;;
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
详细讲解:
《算法竞赛入门经典(第2版)》 刘汝佳 著 P225