题目链接:http://poj.org/problem?id=2299
树状数组求逆序对,要先离散
贴代码
var a,b,c,id:array[0..500005]of longint;
n:longint;
ans:int64;
procedure swap(var x,y:longint);
var t:longint;
begin
t:=x;x:=y;y:=t;
end;
procedure qsort(L,R:longint);
var i,j,mid:longint;
begin
i:=L;j:=R;mid:=a[random(R-L+1)+L];
repeat
while a[i]>mid do inc(i);
while a[j]<mid do dec(j);
if i<=j then begin
swap(a[i],a[j]);swap(id[i],id[j]);
inc(i);dec(j);
end;
until i>j;
if i<R then qsort(i,R);
if L<j then qsort(L,j);
end;
function lowbit(x:longint):longint;
begin
lowbit:=x and (-x);
end;
procedure add(x:longint);
begin
while x<=n do
begin
inc(c[x]);
inc(x,lowbit(x));
end;
end;
function query(x:longint):longint;
var s:longint;
begin
s:=0;
while x>=1 do
begin
inc(s,c[x]);
dec(x,lowbit(x));
end;
exit(s);
end;
procedure init;
begin
assign(input,'ultra.in');reset(input);
assign(output,'ultra.out');rewrite(output);
end;
procedure main;
var i:longint;
begin
readln(n);
while n<>0 do
begin
fillchar(c,sizeof(c),0);
for i:=1 to n do readln(a[i]);
for i:=1 to n do id[i]:=i;
qsort(1,n);
b[n]:=1;
for i:=n-1 downto 1 do
if a[i]=a[i+1] then b[i]:=b[i+1]
else b[i]:=b[i+1]+1;
for i:=1 to n do a[id[i]]:=b[i];
ans:=0;
for i:=n downto 1 do
begin
inc(ans,query(a[i]-1));
add(a[i]);
end;
writeln(ans);
readln(n);
end;
end;
procedure print;
begin
close(input);close(output);
end;
begin
// init;
main;
// print;
end.
【写的有漏洞的,欢迎路过大神吐槽】
2016/11/14 12:39:21
Ending.