var
n,i:longint;
ans:int64;
a,temp:array[1..100000] of longint;
procedure merge(l,m,r:longint);
var
i,j,k:longint;
begin
i:=l;
j:=m+1;
for k:=l to r do
begin
if(i<=m) and ((j>r)or(a[i]<=a[j])) then
begin
temp[k]:=a[i];
inc(i);
end
else
begin
temp[k]:=a[j];
inc(j);
inc(ans,m-i+1);{统计此区间内的逆序对数,若右区间有输出则将ans加上左区间剩下的个数}
end;
end;
for k:=l to r do a[k]:=temp[k];
end;
procedure sort(l,r:longint);
var
m:longint;
begin
m:=(l+r) shr 1;
if l<>r then
begin
sort(l,m);
sort(m+1,r);
merge(l,m,r);
end;
end;
begin
ans:=0;
read(n);
for i:=1 to n do
read(a[i]);
sort(1,n);
writeln(ans);
end.
逆序对数{nlogn,归排}
最新推荐文章于 2021-11-11 00:17:13 发布