(逆序对) 对于一个包含N个非负整数的数组A[1..n],如果有i<j,且A[i]>A[j],则称(A[i],A[j])为数组A中的一个逆序对。例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个。 (n<=1,000,000)
求n个数中的逆序对个数。
【样例输入】
5
3 1 4 5 2
【样例输出】
4
算法提示:采用归并排序的方式,在归并排序的合并过程中统计逆序对数量。
var
a,b:array[1..1000000]of longword;
i,n:longword;
ans:qword;
procedure Merge(l,mid,r:longword);
var
x,y,i,loc:longword;
begin
x:=l;y:= _mid+1_ ;loc:=l;
while(x<=mid)and(y<=r)do
if a[x]<=a[y]then
begin
_b[loc]:=a[x]_ ;inc(loc);inc(x);
end
else
begin
ans:=ans+ _ans+mid-x+1_ ;
b[loc]:=a[y];inc(loc);inc(y);
end;
for i:=x to mid do
begin
b[loc]:=a[i];inc(loc);
end;
for i:=y to r do
begin
b[loc]:=a[i];inc(loc);
end;
for i:=l to r do a[i]:=b[i];
end;
procedure MergeSort(l,r:longword);
var
mid:longword;
begin
if l=r then exit;
mid:=(l+r)div 2;
MergeSort(l,mid);
MergeSort( _mid+1,r_ );
Merge(l,mid,r);
end;
begin
readln(n);
for i:=1 to n do read(a[i]);
MergeSort(1,n);
write( _ans_ );
end.