永发信息网

用树状数组 求逆序对 pascal语言

答案:1  悬赏:60  手机版
解决时间 2021-01-21 06:21
用树状数组 求逆序对 pascal语言
最佳答案
var
n,i,ans,j,t,m:longint;
a,b,c:array[0..200000] of longint;
function lowbit(i:longint):longint;
begin
exit(i and (-i));
end;
procedure add(k:longint);
var
t:longint;
begin
while k<=n do
begin
inc(c[k]);
inc(k,lowbit(k));
end;
end;
function getsum(k:longint):longint;
begin
getsum:=0;
while k>0 do
begin
inc(getsum,c[k]);
dec(k,lowbit(k));
end;
end;
procedure qsort(l,r:longint);
var
i,j,t,p:longint;
begin
if l>=r then exit;
i:=random(r-l+1)+l;t:=a[i];p:=b[i];
a[i]:=a[l];b[i]:=b[l];i:=l;j:=r;
while i begin
while (i while (i if i=j then break;a[j]:=a[i];b[j]:=b[i];dec(j);
end;
a[i]:=t;b[i]:=p;
qsort(l,i-1);qsort(i+1,r);
end;
begin
randomize;
read(n);
for i:=1 to n do
begin
read(a[i]);
b[i]:=i;
end;
qsort(1,n);c:=a;
for i:=1 to n do
if c[i]<>c[i-1] then
begin
inc(m);
a[b[i]]:=m;
end
else a[b[i]]:=m;
fillchar(c,sizeof(c),0);
for i:=1 to n do
begin
inc(ans,getsum(m)-getsum(a[i]));
add(a[i]);
end;
write(ans);
end.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
尼桑天籁气囊故障码1134
西红柿生吃,算蔬菜还是水果?
“忽如一夜春风来,千树万树梨花开”一句写的
0.04mol/l碳酸的ph的计算
His little brother is young, but he can do
直接写出得数.50×20=400÷20=25×20=45+5-4
八十平方千米和九千公顷谁大
这班航班能在飞机上看见日出吗?
5.4与6.3的和除以0.9商是多少
知道等腰三角形的底长是多少,问腰长怎么算
体检前3小时能喝百事可乐吗?
车换过前面的保险杠,是不是表示出过大事故
何谓八个不交不接
华擎玩家3一键超频好用吗,CPU是fx8300
戴尔KM632蓝牙键盘如何配对
推荐资讯
惘然无措的意思是什么?
中国石化加油站(东坡大道)地址有知道的么?有
狗狗能分清人类的性别吗
curl exec failed timeout was reached'
熬小米鱼粥要下什么菜?
河南省平玉县离邓州市十林镇有多远
想学内家功夫,不求多好,只求能感觉到有气就
东北偏东向,东南偏南向都有什么地方
单选题二十世纪中期,人们模仿、再现生活的手
汉代陶器有落款的值钱吗
柳高录取标准是什么?
汉中的市花,市树分别是?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?