不是VIP会员,不能显示答案

题目解答

题目:
(逆序对) 对于一个包含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.
考点:
分析:
解答:
评论:
老师: