P1908 逆序对

来源:互联网 发布:恒久网络 编辑:程序博客网 时间:2024/05/17 08:05

题目描述

给n个数字,求出这条序列中有多少个逆序对。(i<j且a[i]>a[j])

样例输入

65 4 2 6 3 1

样例输出

11

思路

O(n log n)归并排序,排序是交换的次数就是逆序对的个数。
var  a,r:array[1..100000] of longint;  n,ans:longint;procedure msort(s,t:longint);var  mid,i,j,k:longint;begin  if s=t then exit;  mid:=(s+t) div 2;  msort(1,mid);  msort(mid+1,t);  i:=1;j:=mid+1;  while i<=mid do    begin      k:=i;      repeat        if (a[i]<=a[j])or(j>t) then          begin            r[k]:=a[i];            inc(i);          end        else          begin            r[k]:=a[j];            inc(j);            ans:=ans-i+mid+1;          end;        inc(k);      until k>j;    end;  for k:=1 to t do a[k]:=r[k];end;var  i:longint;begin  readln(n);  for i:=1 to n do read(a[i]);  msort(1,n);  writeln(ans);end.
1 1
原创粉丝点击