嗯刚A了它~
就是先排个序,然后搞他们应该在哪个位置上,然后求逆序对
Code:
const maxm=99999997;
type pppp=record
num,old:longint;
end;
var a,b:array[0..1000000] of pppp;
hash,step:array[0..1000000] of longint;
i,j,k,n,ans:longint;
t:pppp;
procedure init;
begin
readln(n);
for i:=1 to n do
begin
read(a[i].num);
a[i].old:=i;
end;
for i:=1 to n do
begin
read(b[i].num);
b[i].old:=i;
end;
end;
procedure qsort(l,r:longint);
var i,j,mid:longint;
begin
i:=l;j:=r;mid:=a[(i+j) div 2].num;
repeat
while (a[i].num<mid) do inc(i);
while (a[j].num>mid) do dec(j);
if i<=j then begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
inc(i); dec(j);
end;
until i>j;
if j>l then qsort(l,j);
if i<r then qsort(i,r);
end;
procedure qsort1(l,r:longint);
var i,j,mid:longint;
begin
i:=l;j:=r;mid:=b[(i+j) div 2].num;
repeat
while (b[i].num<mid) do inc(i);
while (b[j].num>mid) do dec(j);
if i<=j then begin
t:=b[i];
b[i]:=b[j];
b[j]:=t;
inc(i); dec(j);
end;
until i>j;
if j>l then qsort1(l,j);
if i<r then qsort1(i,r);
end;
procedure merge(l,r:longint);
var i,j,k,mid:longint;
begin
if l>=r then exit;
mid:=(l+r) shr 1;
merge(l,mid);
merge(mid+1,r);
i:=l; j:=mid+1; k:=l;
repeat
if hash[i]>hash[j] then begin
step[k]:=hash[j];
ans:=(ans+(mid-i+1)) mod maxm;
inc(k);
inc(j);
end
else begin
step[k]:=hash[i];
inc(k);
inc(i);
end;
until ((i>mid) or (j>r));
while (i<=mid) do
begin
step[k]:=hash[i];
inc(i);
inc(k);
end;
while (j<=r) do
begin
step[k]:=hash[j];
inc(j);
inc(k);
end;
for i:=l to r do hash[i]:=step[i];
end;
procedure main;
begin
init;
qsort(1,n);
qsort1(1,n);
for i:=1 to n do
hash[a[i].old]:=b[i].old;
merge(1,n);
writeln(ans);
end;
begin
main;
end.