请问如何用归并求出逆序对个数
pascal吧
全部回复
仅看楼主
level 6
题目如下
1、逆序对个数(deseq.pas)
【题目描述】给出一个数列{an},如果存在 i<j,但是 a[i]>a[j]那么我们称 a[i]与 a[j]是一对逆序对,现要求求出数列{an}中逆序对的个数。
【输入格式】输入第一行为整数 N(N<=10000),接下来 n 行即为数列an
【输出格式】输出仅一个数,即逆序对的个数
【输入样例】deseq.in
4
3
2
3
2
【输出样例】deseq.out
3
不要试图用冒泡,冒泡仅可以过三个点
求程序
图片来自:萌的葱葱的百度相册
2013年03月17日 11点03分 1
level 9
= =
2013年03月17日 12点03分 2
level 7
一边归并,一边计算逆序对就可以了……
2013年03月18日 04点03分 3
能详细一点吗?最好有标程[呵呵]
2013年03月18日 12点03分
回复 萌的葱葱 :自己模拟一下归并……举举例子就出来了……囧……
2013年03月18日 14点03分
回复 萌的葱葱 :没敲过这个的程序,很少遇到要逆序对的……就算要逆序对,临时弄应该没问题
2013年03月18日 14点03分
level 1
LS一语道破天机 不过说跟没说一样……
2013年03月18日 11点03分 4
level 7
有一个树状数组的程序、、、、
100000完过。。。
[无效] http://pan.baidu.com/share/link?shareid=479998&uk=2517410485
网盘。。。自己看看吧。。。
2013年03月19日 05点03分 5
level 1
var
a,lt:array[1..50000] of longint;
i,x,n:longint;
ans:int64;
procedure mcom(s,md,t:longint);
var
l,r,i:longint;
begin
l:=s;
r:=md+1;
for i:=s to t do
begin
if (l<=md) and ((r>t) or (a[l]<=a[r])) then
begin
lt[i]:=a[l];
inc(l);
end
else
begin
lt[i]:=a[r];
inc(r);
x:=x+md-l+1;
end;
end;
for i:=s to t do a[i]:=lt[i];
end;
procedure msort(s,t:longint);
var
md:longint;
begin
if s<>t then
begin
md:=(s+t) shr 1;
msort(s,md);
msort(md+1,t);
mcom(s,md,t);
end;
end;
function pw(k:longint):int64;
begin
if k=0 then exit(1);
pw(k shr 1);
ans:=ans*ans mod 1991;
if odd(k) then ans:=ans*2 mod 1991;
exit(ans);
end;
begin
assign(input,'sequence.in');
assign(output,'sequence.out');
reset(input);
rewrite(output);
readln(n);
x:=0;
fillchar(a,sizeof(a),0);
for i:=1 to n do read(a[i]);
msort(1,n);
ans:=1;
writeln(pw(x));
close(input);
close(output);
end.
2016年08月16日 03点08分 6
level 4
巧了,今天正好写完这题
2016年08月16日 12点08分 7
1