WikiOI 4163 hzwer与逆序对 (归并排序)

4163 hzwer与逆序对
时间限制: 1 s
空间限制: 256000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
hzwer在研究逆序对。
对于数列{a},如果有序数对(I,j)满足:j>i,a[i]>a[j],则(i,j)是一对逆序对。
给定一个数列{a},求逆序对个数。
输入数据较大,请使用scanf代替cin读入。
*为防卡评测,时限调低至1s

输入描述 Input Description
第一行一个数n,表示{a}有n个元素。
接下来n个数,描述{a}。

输出描述 Output Description
一个数,表示逆序对个数。

样例输入 Sample Input
5
3 1 5 2 4

样例输出 Sample Output
4

数据范围及提示 Data Size & Hint
对于10%数据,1<=n<=100.
对于20%数据,1<=n<=10000.
对于30%数据,1<=n<=100000.
对于100%数据,1<=n<=1000000,1<=a[i]<=10^8.

注意求逆序对类问题的时候开int64 就可以了

program mys;
var i,j,k,m,n:longint;
a,b:array[0..2000000]of longint;
ans:int64;
procedure ms(l,r:longint);
var i,j,k,m:longint;
begin 
if l=r then exit;
m:=(l+r)div 2;
ms(l,m); ms(m+1,r);
i:=l; j:=m+1; k:=l;
while (i<=m)and(j<=r) do 
begin 
if a[i]>a[j] then 
begin 
ans:=ans+m-i+1; b[k]:=a[j]; inc(k); inc(j);
end
else 
begin 
b[k]:=a[i]; inc(k); inc(i);
end;
end;
while i<=m do 
begin 
b[k]:=a[i]; inc(i); inc(k);
end;
while j<=r do
begin 
b[k]:=a[j]; inc(j); inc(k);
end;
for i:=l to r do a[i]:=b[i];
end;

begin 
readln(n);
for i:=1 to n do 
read(a[i]);
ans:=0;
ms(1,n);
writeln(ans);
end.

你可能感兴趣的:(基础算法)