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

来源:互联网 发布:mcs 51系列单片机 编辑:程序博客网 时间:2024/05/16 10:46

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);endelse 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 dobegin 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.
0 0
原创粉丝点击