题目描述
现在有两个长度为n的排列p和s。要求通过交换使得p变成s。交换 pi 和 pj 的代价是|i-j|。要求使用最少的代价让p变成s。
Input
单组测试数据。
第一行有一个整数n (1≤n≤200000),表示排列的长度。
第二行有n个范围是1到n的整数,表示排列p。每个整数只出现一次。
第三行有n个范围是1到n的整数,表示排列s。每个整数只出现一次。
Output
输出一个整数,表示从排列p变到s最少要多少代价。
样例
input
4
4 2 1 3
3 2 4 1
output
3
题解
感谢51nod 1574 排列转换(贪心+鸽巢原理) - free-loop - 博客园和dancer16的题解。
反正看到第一题直觉就是ans肯定是>=∑abs(place[pos[i]]-i)
但无法证明这就是答案。
于是感谢可爱的nbc大姐姐的证明quq
p党瑟瑟发抖quq
var f:array[0..200005] of longint;
i,x,n:longint;
ans:int64;
begin
readln(n);
for i:=1 to n do
begin
read(x);
f[x]:=i;
end;
readln;
for i:=1 to n do
begin
read(x);
ans:=ans+abs(f[x]-i);
end;
readln;
writeln(ans div 2);
end.